如何在 React 导航 5 堆栈导航器中按后退按钮导航到屏幕

Dar*_*ter 1 react-native react-navigation react-navigation-stack

有许多类似的问题已得到解答,但没有一个使用最新的反应导航版本。我想在按后退按钮时从“文档”屏幕转到“主页”屏幕。这是我尝试过的,但它不起作用。

<NavigationContainer>
  <Stack.Navigator initialRouteName="Home" screenOptions={{ headerShown : false }}>
    <Stack.Screen name="Home" component={Home} />
    <Stack.Screen name="Camera" component={CameraScreen} />
    <Stack.Screen name="Document" component={Document} options={{
      headerLeft: (props) => (<HeaderBackButton {...props} onPress={() => props.navigation.navigate("Home")}/>)
    }} />
  </Stack.Navigator>
</NavigationContainer>
Run Code Online (Sandbox Code Playgroud)

编辑以获得更多说明:我的应用程序从“主页”开始,然后转到“相机”,然后转到“文档”。现在,当我按下手机的后退按钮时,我不想在进入“文档”时返回“相机”,而是直接返回“主页”。根据文档,这是如何覆盖后退按钮。

<Screen
  name="Home"
  component={HomeScreen}
  options={{
  headerLeft: (props) => (
   <HeaderBackButton
     {...props}
     onPress={() => {
       // Do something
     }}
   />
 ),
Run Code Online (Sandbox Code Playgroud)

}}/>;但我不知道如何使用上面的代码去“主页”。所以我搜索了类似的问题,其中大多数都有navigationOptions其他内容。我尝试遵循以下问题的答案。

import { HeaderBackButton } from 'react-navigation';
static navigationOptions = ({navigation}) => {
  return{
    headerLeft:(<HeaderBackButton onPress={()=>{navigation.navigate('A')}}/>)
}
Run Code Online (Sandbox Code Playgroud)

所以是的,即使我使用 console.log,后退按钮也没有响应

Abu*_*ish 8

您可以使用导航“beforeRemove”事件自定义后退按钮行为,该事件在卸载屏幕之前触发。

 useEffect(() => {
    const unsubscribe = navigation.addListener('beforeRemove', e => {
      e.preventDefault(); // Prevent default action
      unsubscribe() // Unsubscribe the event on first call to prevent infinite loop
      navigation.navigate('Home') // Navigate to your desired screen
    });
 }, [])
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是它会在任何类型的后退导航上触发,无论是应用内后退按钮还是设备后退按钮/手势。

导航事件文档