Итак, у меня есть следующие маршруты:
<Router>
<Scene key="root" hideNavBar>
<Stack key="Auth" initial={!this.state.isLoggedIn}>
<Scene key="Login" hideNavBar component={Login} title="Login" />
</Stack>
<Stack key="Main" initial={this.state.isLoggedIn}>
<Scene drawer key="NavDrawer" hideNavBar contentComponent={NavDrawer} type={ActionConst.REPLACE} panHandlers={null}>
<Scene key="homeTab" navBar={() => <PageHeader title='Home' />} drawerLockMode={'locked-closed'}>
<Scene tabs={true} tabBarComponent={ScrollableTabBar} tabBarPosition='top' lazy={true}>
<Scene key="Home" hideNavBar component={Home} title={"Home"} name='Home' />
</Scene>
<Scene key="itemDescription" hideNavBar component={itemDescription} title="Item Description" back />
</Scene>
<Scene key="helpTab" navBar={() => <PageHeader title='Help' />} title="Help" drawerLockMode={'locked-closed'}>
<Scene>
<Scene key="Help" hideNavBar component={Help} title={"Help"} />
</Scene>
</Scene>
<Scene key="settingTab" navBar={() => <PageHeader title='Settings' />} title="Settings" drawerLockMode={'locked-closed'}>
<Scene>
<Scene key="Setting" hideNavBar component={Setting} title={"Setting"} />
</Scene>
</Scene>
<Scene key="QRTab" navBar={() => <PageHeader title='QR Scanner' />} title="QR" drawerLockMode={'locked-closed'}>
<Scene>
<Scene key="QRScanner" hideNavBar component={QRScanner} title={"QR Scanner"} />
</Scene>
</Scene>
</Scene>
</Stack>
</Scene>
</Router>
в моем NavDrawer, у меня есть следующее для обработки аппаратной кнопки возврата:
handleBackButton() {
if (Actions.currentScene === '_Home')
this.onSignOut()
else if (this.state.currentTab !== 'Home') { //in another tab
this.setState({ currentTab: 'Home' })
Actions.homeTab();
}
else if (Actions.currentScene === 'Login')
{
BackHandler.exitApp();
}
else{ //in home tab, siblings of Home scene
Actions.pop();
}
return true;
}
componentDidMount() {
BackHandler.addEventListener('hardwareBackPress', this.handleBackButton);
console.log('didmount')
}
componentWillUnmount() {
BackHandler.removeEventListener('hardwareBackPress');
console.log('unmount')
}
Теперь возникает проблема, когда яавтоматический вход в систему, потому что NavDrawer
находится в корне стека Main
, когда я закрываю приложение и открываю его снова, оно перемонтирует 'NavDrawer`, даже не отключая его.
Для дальнейшего описаниясценарий:
вход в систему -> NavDrawer (componentDidMount
вызван) -> добавлен BackHandler -> закрыть приложение или выполнить горячую перезагрузку (componentWillUnmount
никогда не вызывается, BackHandler остается) -> автоматический вход в систему -> NavDrawer перемонтирован (componentDidMount
вызван снова) -> BackHandler, который прослушивает добавленное то же событие -> двойной BackHandler, вызывающий BackHandler по умолчанию, запускаемый вместо того, который я определил
Так что этот сценарий происходит, пока я не войдуиз которого размонтируется NavDrawer
и вообще удален обработчик, начиная слушателей с чистого листа.Только тогда все работает, как и ожидалось.
Любые предложения, как с этим справиться?
Я думал о том, чтобы поместить removeEventListener
в constructor
, чтобы убедиться, что нет двойных чисел, но я не знаюесли это вызовет проблемы в случае, если нет никаких обработчиков для удаления ..
ОБНОВЛЕНИЕ:
, поэтому я попробовал свое решение и тот, что в комментарии ниже, и оно не сработало,при ближайшем рассмотрении может случиться так, что не может быть никаких литнеров для удаления, которые напрямую связаны с новой «перезагрузкой», поэтому наше решение не сработало.
Однако слушатель все еще остаетсяот предыдущей перезагрузки как-то мешает текущей.потому что после дальнейшего наблюдения я заметил, что в случае закрытого / перезагруженного приложения, когда я помещаю новый Scene
в стек, оно присоединяет новый прослушиватель по умолчанию к этому Scene
, который в стеке слушателя помещается ввершина того, который я хочу использовать.
Я подозревал это, потому что как только сцена, присоединенная к прослушивателю по умолчанию, удаляется из стека, мой слушатель возвращается в бизнес.
Итак ... Короче говоря, мне все еще нужен способопределить сценарий закрытия или перезагрузки приложения, чтобы я мог удалить прослушиватель до того, как все будет перемонтировано без какой-либо размонтировки.ИЛИ принудительно активируйте componentWillUnmount
или поместите мой removeListener
на аналогичные крючки, когда это произойдет