Есть ли способ не дать пользователю, нажимающему кнопку "Назад" на своем устройстве, вытолкнуть текущий вид из стека?

Я использую React-Native-Navigation из Wix (версия 2) для настройки навигации в моем приложении React Native. Я использую sideMenu макет с центральной секцией, являющейся стеком. Когда пользователь выбирает один из элементов бокового меню, выбранный вид помещается в этот центральный стек. Если пользователь нажимает кнопку "Назад" на Android, то представление выталкивается из стека, но я не всегда хочу, чтобы это происходило, в основном, если выбранное представление является WebView,

Если вид WebViewЯ хочу вручную обработать пользователя, нажав кнопку аппаратного возврата. Если WebView Можно "goBackmsgstr "тогда представление вернется назад, но если это невозможно, то представление будет извлечено из стека (как обычно).

Я пытался переопределить нажатие кнопки назад, используя BackHandler класс от react-native и это позволяет мне захватить эту прессу и иметь WebView Вернитесь назад, если сможете, но также срабатывает процесс выталкивания представления из стека. Есть ли способ в React-Native-Navigation v2 сказать ему: "Эй, я понял, не высовывайся, пока я тебе не скажу"?

Мой текущий код для этого раздела выглядит следующим образом:

componentDidMount() {
    BackHandler.addEventListener('hardwareBackPress', this.backHandler);
}

componentWillUnmount() {
    BackHandler.removeEventListener('hardwareBackPress', this.backHandler);
}

backHandler = () => {
    if (this.state.canGoBack) {
        this.webviewRef.current.goBack();

        // I thought this might force the back press to be
        // ignored by react-native-navigation, but no dice.
        return false; 
    } else {
        // WebView can't go back so pop view like normal
        Navigation.pop(this.props.componentId);
    }
}

Я ожидал, что это вытолкнет представление из стека, только если WebView в настоящее время не может вернуться, а в противном случае просто вернет WebView.

На самом деле происходит пожар обоих событий Т.е. WebView возвращается, но представление также извлекается из стека.

1 ответ

Я смог найти ответ на этот вопрос, еще покопавшись в документах React Native Navigation и React Native.

Подписки на события вызываются в обратном порядке (т. Е. Последняя зарегистрированная подписка сначала), и если одна подписка возвращает значение true, ранее зарегистрированные подписки вызываться не будут.

Так что проблема была в моем backHandler метод. Вместо возвращения false Мне нужно было вернуться true,

backHandler = () => {
    if (this.state.canGoBack) {
        this.webviewRef.current.goBack();

        // We've handled the event so we return true and the
        // handler on the view's parent can effectively be ignored. Yay!
        return true;
    } else {
        // WebView can't go back so pop view like normal
        Navigation.pop(this.props.componentId);
    }
}