Есть ли способ не дать пользователю, нажимающему кнопку «Назад» на своем устройстве, вытолкнуть текущий вид из стека? - PullRequest
0 голосов
/ 15 января 2019

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

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

Я попытался переопределить нажатие кнопки «назад», используя класс 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 Ответ

0 голосов
/ 15 января 2019

Я смог найти ответ на этот вопрос, еще покопавшись в документах 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);
    }
}
...