如何让 react-native 中的 backhandler 返回主屏幕而不是退出应用程序?

How to make backhandler in react-native go back to home screen rather than exit app?

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')

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

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

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;
    }
};

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)
    }, [])
  )
}