Есть ли способ не дать пользователю, нажимающему кнопку "Назад" на своем устройстве, вытолкнуть текущий вид из стека?
Я использую React-Native-Navigation из Wix (версия 2) для настройки навигации в моем приложении React Native. Я использую sideMenu
макет с центральной секцией, являющейся стеком. Когда пользователь выбирает один из элементов бокового меню, выбранный вид помещается в этот центральный стек. Если пользователь нажимает кнопку "Назад" на Android, то представление выталкивается из стека, но я не всегда хочу, чтобы это происходило, в основном, если выбранное представление является WebView
,
Если вид WebView
Я хочу вручную обработать пользователя, нажав кнопку аппаратного возврата. Если WebView
Можно "goBack
msgstr "тогда представление вернется назад, но если это невозможно, то представление будет извлечено из стека (как обычно).
Я пытался переопределить нажатие кнопки назад, используя 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);
}
}