从组件内重置 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' }],
});
广泛问题(对于搜索相同解决方案的个人):
我有一个带有基于开关的 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' }],
});