Как убедиться, что BackHandler не удваивается для одного и того же события? - PullRequest
0 голосов
/ 22 мая 2018

Итак, у меня есть следующие маршруты:

<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 на аналогичные крючки, когда это произойдет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...