从组件内重置 StackNavigator

Reset StackNavigator from within the Component

广泛问题(对于搜索相同解决方案的个人):

我有一个带有基于开关的 StackNavigator(“MainStack”)的应用程序。我想将 MainStack 重置为 {index: 1, routes: [{name: 'Home', name: 'NestedStack'}]},我想从 within MainStack 组件(见下文)

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        {
           anon ?
           <Stack.Screen name="Auth" component={AuthScreen} />
           <Stack.Screen name="MainStack" component={MainStackScreen} />
        }
      </Stack.Navigator>
    </NavigationContainer>
  );
}

const MainStack = createStackNavigator();

function MainStackScreen({navigation, route}) {

  
  *** An event occurs here ***
  *** And I'd like to respond to the event with a navigation.reset() ***

  return (
    <MainStack.Navigator>
      <MainStack.Screen name="Home" component={Home} />
      <MainStack.Screen name="NestedStack" component={NestedStackScreen} />
    </MainStack.Navigator>
  );
}

我已经尝试了 navigation.dispatch({...CommonActions.reset({}), target} 的几种不同组合,从屏幕上产生了不同的错误,而 [=37 的问题不存在=].

我也非常感谢有关如何为 NestedStack 指定从哪个屏幕开始的建议...这只是 {name: 'NestedStack', screen: 'NestedScreen'}??

具体用例: 我真正想要实现的是链接。我有用户在应用程序关闭时打开链接(我通过 Linking.getInitialURL 访问)和应用程序内的相机屏幕(我通过 Linking.addEventListener 收听)。我已将这两个都放在 MainStack 组件中,以便在应用程序从身份验证流程切换时拦截链接,并在应用程序中扫描二维码时拦截链接。

我必须监听 MainStackScreen 路由的变化,然后在路由完全安装后将变量 isNavigatorMounted 设置为 true,然后触发我对 Linking.getInitialURL.

的检查

请解决一般 Whosebug 用户的广泛问题,但如果这是一种非常低效的方法,请告诉我。

已提供此答案https://discord.com/channels/102860784329052160/288388742929055765/770038660220715028

您不需要 CommonActions 或任何东西。只需将以下内容应用于 StackNavigator 的导航对象:

navigation.reset({
    routes: [{ name: 'Home' }, { name: 'NestedStack' }],
});