diff --git a/android/app/src/main/java/com/reactnativenavigation/screens/Screen.java b/android/app/src/main/java/com/reactnativenavigation/screens/Screen.java index fcf42931728..89441810bcc 100644 --- a/android/app/src/main/java/com/reactnativenavigation/screens/Screen.java +++ b/android/app/src/main/java/com/reactnativenavigation/screens/Screen.java @@ -9,6 +9,7 @@ import android.widget.RelativeLayout; import com.facebook.react.bridge.Callback; +import com.reactnativenavigation.NavigationApplication; import com.reactnativenavigation.animation.VisibilityAnimator; import com.reactnativenavigation.events.ContextualMenuHiddenEvent; import com.reactnativenavigation.events.Event; @@ -218,19 +219,27 @@ private void setButtonColorFromScreen(List titleBarButtonP public abstract void setOnDisplayListener(OnDisplayListener onContentViewDisplayedListener); public void show() { + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("willAppear", screenParams.getNavigatorEventId()); + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("didAppear", screenParams.getNavigatorEventId()); screenAnimator.show(screenParams.animateScreenTransitions); } public void show(boolean animated) { + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("willAppear", screenParams.getNavigatorEventId()); + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("didAppear", screenParams.getNavigatorEventId()); screenAnimator.show(animated); } public void show(boolean animated, Runnable onAnimationEnd) { + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("willAppear", screenParams.getNavigatorEventId()); + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("didAppear", screenParams.getNavigatorEventId()); setStyle(); screenAnimator.show(animated, onAnimationEnd); } public void hide(boolean animated, Runnable onAnimatedEnd) { + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("willDisappear", screenParams.getNavigatorEventId()); + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("didDisappear", screenParams.getNavigatorEventId()); screenAnimator.hide(animated, onAnimatedEnd); } diff --git a/android/app/src/main/java/com/reactnativenavigation/screens/ScreenStack.java b/android/app/src/main/java/com/reactnativenavigation/screens/ScreenStack.java index 6ae89c647a1..4570784994c 100644 --- a/android/app/src/main/java/com/reactnativenavigation/screens/ScreenStack.java +++ b/android/app/src/main/java/com/reactnativenavigation/screens/ScreenStack.java @@ -117,6 +117,7 @@ private void pushScreenToVisibleStack(LayoutParams layoutParams, @Nullable final Screen.OnDisplayListener onDisplay) { nextScreen.setVisibility(View.INVISIBLE); addScreen(nextScreen, layoutParams); + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("willDisappear", previousScreen.getNavigatorEventId()); nextScreen.setOnDisplayListener(new Screen.OnDisplayListener() { @Override public void onDisplay() { @@ -124,6 +125,7 @@ public void onDisplay() { @Override public void run() { if (onDisplay != null) onDisplay.onDisplay(); + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("didDisappear", previousScreen.getNavigatorEventId()); parent.removeView(previousScreen); } }); @@ -196,6 +198,8 @@ public Screen peek() { private void readdPrevious(Screen previous) { previous.setVisibility(View.VISIBLE); + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("willAppear", previous.getNavigatorEventId()); + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("didAppear", previous.getNavigatorEventId()); parent.addView(previous, 0); } @@ -347,9 +351,13 @@ public void show() { isStackVisible = true; stack.peek().setStyle(); stack.peek().setVisibility(View.VISIBLE); + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("willAppear", stack.peek().getNavigatorEventId()); + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("didAppear", stack.peek().getNavigatorEventId()); } public void hide() { + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("willDisappear", stack.peek().getNavigatorEventId()); + NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("didDisappear", stack.peek().getNavigatorEventId()); isStackVisible = false; stack.peek().setVisibility(View.INVISIBLE); } diff --git a/ios/RCCViewController.m b/ios/RCCViewController.m index c849bd6d1e6..276b50ad38a 100755 --- a/ios/RCCViewController.m +++ b/ios/RCCViewController.m @@ -6,6 +6,7 @@ #import #import "RCCManager.h" #import +#import #import "RCCExternalViewControllerProtocol.h" #import "RCTHelpers.h" #import "RCCTitleViewHelper.h" @@ -173,17 +174,46 @@ -(void)onCancelReactTouches } } +- (void)sendScreenChangedEvent:(NSString *)eventName +{ + if ([self.view isKindOfClass:[RCTRootView class]]){ + + RCTRootView *rootView = (RCTRootView *)self.view; + + if (rootView.appProperties && rootView.appProperties[@"navigatorEventID"]) { + + [[[RCCManager sharedInstance] getBridge].eventDispatcher sendAppEventWithName:rootView.appProperties[@"navigatorEventID"] body:@ + { + @"type": @"ScreenChangedEvent", + @"method": eventName + }]; + } + } +} + +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + [self sendScreenChangedEvent:@"didAppear"]; +} + - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - + [self sendScreenChangedEvent:@"willAppear"]; [self setStyleOnAppear]; } +- (void)viewDidDisappear:(BOOL)animated +{ + [super viewDidDisappear:animated]; + [self sendScreenChangedEvent:@"didDisappear"]; +} + - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; - + [self sendScreenChangedEvent:@"willDisappear"]; [self setStyleOnDisappear]; }