Skip to content

Commit be6b83a

Browse files
Merge pull request #1 from OneAboveAll1964/fix-android-app-crash-on-start
fix(android): prevent NullPointerException crashes during setRoot when activity is destroyed
2 parents ccd0ecb + 3d9246e commit be6b83a

2 files changed

Lines changed: 12 additions & 2 deletions

File tree

android/src/main/java/com/reactnativenavigation/react/NavigationTurboModule.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ class NavigationTurboModule(
3232
private lateinit var eventEmitter: EventEmitter
3333

3434
init {
35+
activity()?.let { act ->
36+
act.navigator?.let { nav ->
37+
eventEmitter = EventEmitter(reactContext)
38+
layoutFactory.init(act, eventEmitter, nav.childRegistry,
39+
(reactApplicationContext.applicationContext as NavigationApplication).externalComponents)
40+
}
41+
}
42+
3543
reactContext.addLifecycleEventListener(object : LifecycleEventListenerAdapter() {
3644
override fun onHostPause() {
3745
super.onHostPause()
@@ -83,12 +91,12 @@ class NavigationTurboModule(
8391
)
8492
handle {
8593
Log.d("NavigationTurboModule", "setRoot handle ${Thread.currentThread()}")
86-
val viewController = layoutFactory.create(layoutTree)
8794
val activity = currentActivity
8895
if (activity == null) {
8996
promise.reject("ACTIVITY_NULL", "Activity is null")
9097
return@handle
9198
}
99+
val viewController = layoutFactory.create(layoutTree)
92100
navigator()?.setRoot(
93101
viewController,
94102
NativeCommandListener("setRoot", commandId, promise, eventEmitter, now)

android/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/RootPresenter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ public RootPresenter(RootAnimator animator, LayoutDirectionApplier layoutDirecti
3535
}
3636

3737
public void setRoot(ViewController appearingRoot, ViewController<?> disappearingRoot, Options defaultOptions, CommandListener listener) {
38-
layoutDirectionApplier.apply(appearingRoot, defaultOptions);
3938
if (appearingRoot.isDestroyed()) {
4039
listener.onError("Could not set root - appearingRoot is already destroyed");
4140
return;
4241
}
42+
layoutDirectionApplier.apply(appearingRoot, defaultOptions);
4343
rootLayout.addView(appearingRoot.getView(), matchParentWithBehaviour(new BehaviourDelegate(appearingRoot)));
4444
Options options = appearingRoot.resolveCurrentOptions(defaultOptions);
4545
AnimationOptions enter = options.animations.setRoot.getEnter();
@@ -78,6 +78,8 @@ private void animateSetRootAndReportSuccess(ViewController root,
7878
() -> {
7979
if (!root.isDestroyed()) {
8080
listener.onSuccess(root.getId());
81+
} else {
82+
listener.onError("Could not set root - root was destroyed before animation completed");
8183
}
8284
return Unit.INSTANCE;
8385
});

0 commit comments

Comments
 (0)