【问题标题】:How to navigate to another screen on back key press in react native?如何在本机反应中按后退键导航到另一个屏幕?
【发布时间】:2021-05-03 07:44:50
【问题描述】:

我试图在用户单击返回按钮时发出警报,在该按钮将提供两个选项,是或否。如果用户单击“否”,用户将停留在该屏幕上,如果用户按下“是” " 那么,我想显示一些不同的屏幕。

基本上,我想阻止用户返回上一个屏幕,而是将用户重定向到另一个屏幕。 这是我试图使其工作的示例 useEffect 代码:

useEffect(() => {
    navigation.addListener('beforeRemove', (e) => {
      e.preventDefault();

      Alert.alert(
        'Registration Process',
        'Are you sure you want to cancel the registration process?',
        [
          {
            text: 'Yes',
            style: 'destructive',
            // If the user confirmed, then we dispatch the action we blocked earlier
            // This will continue the action that had triggered the removal of the screen
            onPress: () => {
              // navigation.dispatch(e.data.action);
              navigation.navigate('SignUp');  // On pressing Yes, user should be shown this screen.
            },
          },
          {text: 'No', style: 'cancel', onPress: () => {}},
        ],
      );
    });
  }, [navigation]);

运行应用程序后,当我按“是”时,我会一次又一次地收到警告框。

【问题讨论】:

  • 此方法将继续无限运行..检查我的答案以获得更好的实施

标签: react-native navigation screen event-listener react-native-navigation


【解决方案1】:

您可以创建一个hook 并在用户尝试离开页面时在backpress 上调用它

在您的App.js 所在的位置创建一个名为hooks 的文件夹。

在其中创建一个名为useBackHandler.ts的文件

useBackHandler.ts里面粘贴这个

import { useEffect } from 'react';
import { BackHandler } from 'react-native';

export function useBackHandler(handler: () => boolean) {
  useEffect(() => {
    BackHandler.addEventListener('hardwareBackPress', handler);

    return () => BackHandler.removeEventListener('hardwareBackPress', handler);
  }, [handler]);
}

然后在您的RegisterScreen 中创建一个函数以在backpress 上执行或当用户想要像这样返回时

const AlertConfirmation = () => {
    Alert.alert(
      'Registration Process',
      'Are you sure you want to cancel the registration process?',
      [
        {
          text: 'Yes',
          style: 'destructive',
          onPress: () => {
            navigation.navigate('ScreenOne');
          },
        },
        { text: 'No', style: 'cancel', onPress: () => {} },
      ]
    );
  };

我创建了一个 Snack 供您查看工作示例..

签出this

【讨论】:

  • 谢谢!那行得通。你能解释一下这背后的工作吗? .我从未创建过自定义钩子。
  • 是的,当然!...这里发生的是每当我们按下Back 按钮时,BackHandler 事件侦听器被触发并停止返回的default action...然后它执行AlertConfirmation显示警报框的函数。
  • 为什么我的方法不起作用?为什么会无限运行?我认为它可能会无限运行,因为我想点击“是”时屏幕不断被删除?
  • 因为您知道在useEffect 的依赖项中包含了navigation 属性...这意味着您在useEffect 中编写的代码块将在@987654338 发生更改时运行@ prop...所以现在...每当您在警报中按下“YES”选项时,它都会再次执行useEffect 部分,因此它会继续无限运行。
猜你喜欢
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2021-02-23
相关资源
最近更新 更多