【问题标题】:How to make backhandler in react-native go back to home screen rather than exit app?如何让 react-native 中的后处理程序返回主屏幕而不是退出应用程序?
【发布时间】:2021-06-04 07:08:42
【问题描述】:

在官方文档中backhandler 在 react native 中,用于退出应用程序的后处理程序。

这是文档

useEffect(() => {
    const backAction = () => {
      Alert.alert("Hold on!", "Are you sure you want to go back?", [
        {
          text: "Cancel",
          onPress: () => null,
          style: "cancel"
        },
        { text: "YES", onPress: () => BackHandler.exitApp() }
      ]);
      return true;
    };

    const backHandler = BackHandler.addEventListener(
      "hardwareBackPress",
      backAction
    );

    return () => backHandler.remove();
  }, []);

我想做的是简化它,而不是退出应用程序,我想在点击physical back button(backhandler)时将其导航到主页

这里是代码

const CheckOutOrderReceipt = ({navigation, route}) => {
  const {OrderId} = route.params;

  useEffect(() => {
    const backAction = () => {
      BackHandler.navigation.reset({
        index: 0,
        routes: [{name: 'Home'}],
      });
            return true
    };
    const backHandler = BackHandler.addEventListener(
      'hardwareBackPress',
      backAction,
    );
    return () => backHandler.remove();
  }, []);

但是什么时候按后退按钮。我收到了这个错误

undefined is not an object (evaluating '_reactNative.BackHandler.navigation.reset')

我做错了什么。有人请推荐

【问题讨论】:

    标签: reactjs react-native react-navigation


    【解决方案1】:

    BackHandler 只负责 Android 的后退按钮。 所以它没有 navigation 相关的东西。

    你可以简单地使用导航道具

    import { CommonActions } from '@react-navigation/native';
    ...
    const backAction = () => {
    navigation.dispatch(
      CommonActions.reset({
         index: 0,
         routes: [{name: 'Home'}],
      })
    );
    }
    

    而且我们不想让听众一团糟,我们会使用useFocusEffect 而不是useEffect

    我们在一起有这样的东西:

    
    const CheckOutOrderReceipt = ({ navigation, route }) => {
      const { OrderId } = route.params
    
      useFocusEffect(
        React.useCallback(() => {
          const onBackPress = () => {
            Alert.alert('Hold on!', 'Are you sure you want to exit app?', [
              {
                text: 'Cancel',
                onPress: () => null,
                style: 'cancel'
              },
              {
                text: 'YES',
                onPress: () => {
                  navigation.dispatch(
                    CommonActions.reset({
                      index: 0,
                      routes: [{ name: 'Home' }]
                    })
                  )
                }
              }
            ])
          }
    
          BackHandler.addEventListener('hardwareBackPress', onBackPress)
    
          return () =>
            BackHandler.removeEventListener('hardwareBackPress', onBackPress)
        }, [])
      )
    }
    

    【讨论】:

    • 谢谢。你也可以看看这个问题https://stackoverflow.com/questions/67831791/navigation-push-wont-render-new-params-from-route
    【解决方案2】:

    您需要在主屏幕中添加此代码

    import { BackHandler } from 'react-native'
    
    useEffect(() => {
        BackHandler.addEventListener('hardwareBackPress', backAction);
    
        return () =>
            BackHandler.removeEventListener('hardwareBackPress', backAction);
    }, []);
    
      const backAction = () => {
        if (navigation.isFocused()) {
            Alert.alert('Hold on!', 'Are you sure you want to exit app?', [
               {
                   text: 'Cancel',
                    onPress: () => null,
                    style: 'cancel',
                },
               { text: 'YES', onPress: () => BackHandler.exitApp() },
            ]);
            return true;
        }
    };
    

    【讨论】:

    • 您好,我想从 1 条路线导航到另一条路线,而不是退出应用程序
    • 只需删除useEffect 屏幕中的useEffect 代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    相关资源
    最近更新 更多