diff --git a/e2e/Stack.test.js b/e2e/Stack.test.js
index 09316bf18ee..94d036a197e 100644
--- a/e2e/Stack.test.js
+++ b/e2e/Stack.test.js
@@ -59,6 +59,12 @@ describe('Stack', () => {
await expect(elementByLabel('didDisappear')).toBeVisible();
});
+ it('Screen popped event', async () => {
+ await elementById(TestIDs.PUSH_LIFECYCLE_BTN).tap();
+ await elementById(TestIDs.SCREEN_POPPED_BTN).tap();
+ await expect(elementByLabel('Screen popped event')).toBeVisible();
+ });
+
it('unmount is called on pop', async () => {
await elementById(TestIDs.PUSH_LIFECYCLE_BTN).tap();
await elementById(TestIDs.POP_BTN).tap();
diff --git a/lib/ios/StackControllerDelegate.m b/lib/ios/StackControllerDelegate.m
index 9f1fd0c6a08..f49630b532a 100644
--- a/lib/ios/StackControllerDelegate.m
+++ b/lib/ios/StackControllerDelegate.m
@@ -14,7 +14,7 @@ - (instancetype)initWithEventEmitter:(RNNEventEmitter *)eventEmitter {
}
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
- if ([navigationController.viewControllers indexOfObject:_presentedViewController] < 0) {
+ if (_presentedViewController && ![navigationController.viewControllers containsObject:_presentedViewController]) {
[self sendScreenPoppedEvent:_presentedViewController];
}
diff --git a/playground/src/screens/LifecycleScreen.js b/playground/src/screens/LifecycleScreen.js
index 08631c5f5cc..9ed3b31a584 100644
--- a/playground/src/screens/LifecycleScreen.js
+++ b/playground/src/screens/LifecycleScreen.js
@@ -6,6 +6,7 @@ const Screens = require('./Screens');
const {
PUSH_TO_TEST_DID_DISAPPEAR_BTN,
DISMISS_MODAL_BTN,
+ SCREEN_POPPED_BTN,
POP_BTN
} = require('../testIDs');
@@ -25,6 +26,7 @@ class LifecycleScreen extends React.Component {
constructor(props) {
super(props);
+ this.showUnmountAndDisappearAlerts = true;
Navigation.events().bindComponent(this);
}
@@ -33,12 +35,12 @@ class LifecycleScreen extends React.Component {
}
componentDidDisappear() {
- alert('didDisappear'); // eslint-disable-line no-alert
+ this.showUnmountAndDisappearAlerts && alert('didDisappear'); // eslint-disable-line no-alert
}
componentWillUnmount() {
setTimeout(() => {
- alert('componentWillUnmount'); // eslint-disable-line no-alert
+ this.showUnmountAndDisappearAlerts && alert('componentWillUnmount'); // eslint-disable-line no-alert
}, 100);
}
@@ -50,6 +52,7 @@ class LifecycleScreen extends React.Component {
return (
+ {!this.props.isModal && }
{this.renderCloseButton()}
);
@@ -60,6 +63,14 @@ class LifecycleScreen extends React.Component {
;
push = () => Navigation.push(this, Screens.Pushed);
+ screenPoppedEvent = async () => {
+ this.showUnmountAndDisappearAlerts = false;
+ const unregister = Navigation.events().registerScreenPoppedListener((event) => {
+ alert('Screen popped event')
+ unregister.remove();
+ });
+ await Navigation.pop(this);
+ }
pop = () => Navigation.pop(this);
dismiss = () => Navigation.dismissModal(this);
}
diff --git a/playground/src/testIDs.js b/playground/src/testIDs.js
index 91e1713c787..2b682a1bc25 100644
--- a/playground/src/testIDs.js
+++ b/playground/src/testIDs.js
@@ -102,6 +102,7 @@ module.exports = {
PUSH_CONTEXT_SCREEN_BUTTON: `PUSH_CONTEXT_SCREEN_BUTTON`,
PUSH_OPTIONS_BUTTON: `PUSH_OPTIONS_BUTTON`,
PUSH_DEFAULT_OPTIONS_BUTTON: `PUSH_DEFAULT_OPTIONS_BUTTON`,
+ SCREEN_POPPED_BTN: 'SCREEN_POPPED_BTN',
SHOW_REDBOX_BUTTON: `SHOW_REDBOX_BUTTON`,
ORIENTATION_BTN: `ORIENTATION_BUTTON`,
PROVIDED_ID: `PROVIDED_ID`,