如何重置嵌套导航器 (react-navigation v5)

Ami*_*avi 7 reactjs react-native react-navigation react-navigation-stack react-navigation-v5

有两组堆栈导航器;

const SetOneScreens = () => (
  <Stack.Navigator initialRouteName="AScreen">
    <Stack.Screen name="AScreen" component={AScreen} />
    <Stack.Screen name="BScreen" component={BScreen} />
  </Stack.Navigator>
);
const SetTwoScreens = () => (
  <Stack.Navigator initialRouteName="CScreen">
    <Stack.Screen name="CScreen" component={CScreen} />
    <Stack.Screen name="DScreen" component={DScreen} />
  </Stack.Navigator>
);
Run Code Online (Sandbox Code Playgroud)

哪些嵌套在抽屉导航器中

    <NavigationContainer>
      <Drawer.Navigator initialRouteName="SetOneScreens">
        <Drawer.Screen name="SetOneScreens" component={SetOneScreens} />
        <Drawer.Screen name="SetTwoScreens" component={SetTwoScreens} options={{swipeEnabled: false}} />
      </Drawer.Navigator>
    </NavigationContainer>
Run Code Online (Sandbox Code Playgroud)

我想从导航BScreenDScreen并重置堆栈(为了不让android中的硬件后退按钮返回BScreen

在嵌套的情况下,我们应该首先定义导航器名称;我应该如何在重置操作中定义屏幕。

// For navigation 
props.navigation.navigate('setTwoScreens',{screen:'DScreen'})

// For reset I can only navigate to initial screen 
props.navigation.reset({index:0,routes:[{name:'setTwoScreens'}]})
Run Code Online (Sandbox Code Playgroud)

我应该如何处理resetwithnavigationCommonActions

Hei*_*erg 18

如react-navigation-v5文档中所写,您需要使用 reset-action 调度 CommonAction 以清除应用程序的后台堆栈,以便当用户按下设备的硬件后退按钮时,应用程序不会返回上一屏幕,检查下面的例子,

import { CommonActions } from "@react-navigation/native";

props.navigation.dispatch({
  ...CommonActions.reset({
    index: 0,
    routes: [{ name: "AnotherStackNavigator" }]
  })
});
Run Code Online (Sandbox Code Playgroud)

或者,如果您想重置为该 StackNavigator 中的特定屏幕,您可以这样做:

props.navigation.dispatch({
  ...CommonActions.reset({
    index: 0,
    routes: [
      {
        name: "AnotherStackNavigator",
        state: {
          routes: [
            {
              name: "AnotherStackNavigatorScreen",
              params: {         
                  ...
              }
            }
          ]
        }
      }
    ]
  })
});
Run Code Online (Sandbox Code Playgroud)

  • 在文档中很难找到您的解决方案!你拯救了我的一天... (3认同)
  • 使用这个解决方案我面临一个问题。我能够导航到指定深度的不同堆栈,但后退按钮不会转到新堆栈的根目录。如何解决这个问题? (3认同)

Jus*_*son 9

我尝试了 Aditya 的解决方案,但遇到了后退按钮无法返回新堆栈根目录的问题。

这似乎为我解决了这个问题:

props.navigation.dispatch({
  CommonActions.reset({
    index: 0,
    routes: [
      {
        name: "AnotherStackNavigator",
        state: {
          routes: [
            {
              name: "AnotherStackNavigatorRootScreen"
            },
            {
              name: "AnotherStackNavigatorScreen",
              params: {         
                  ...
              }
            }
          ]
        }
      }
    ]
  })
});
Run Code Online (Sandbox Code Playgroud)