React Native嵌套导航异常:Tab切换后页面状态未重置
项目环境与导航结构
Expo托管项目,基于react-navigation/native,结合react-navigation/native-stack和react-navigation/bottom-tabs构建导航体系,具体结构如下:
根导航结构
<Stack.Navigator screenOptions={commonHeaderStyle}> {username && IdUser ? // 用户未登录时无相关数据 <Stack.Screen name="DefaultLogged" component={TabNavigator} initialParams={{IdUser, username}} options={{headerShown: false}} /> : <Stack.Screen name="DefaultHome" component={DefaultScreen} options={(props) => ({ headerShown: true, header: () => (<HomeHeader navigation={props.navigation} />), })} /> } <Stack.Screen name="Default" component={DefaultScreen} options={(props) => ({ headerShown: true, header: () => (<HomeHeader navigation={props.navigation} />), })} /> <Stack.Screen name="Logged" component={TabNavigator} initialParams={{IdUser:null, username:null}} options={{headerShown: false}} /> </Stack.Navigator>
Tab导航(TabNavigator)
<Tab.Navigator> <Tab.Screen name="ProfileRoot" component={ProfileRoot} initialParams={{IdUser, username}} options={{title: 'Perfil', headerShown: false}} /> <Tab.Screen name="WorkersRoot" component={WorkersRoot} options={{ title: 'Trabajadores', headerShown: false}} /> </Tab.Navigator>
ProfileRoot嵌套栈
<Stack.Navigator screenOptions={commonHeaderStyle}> <Stack.Screen name="Profile" component={ProfileScreen} options={{title: 'Perfil'}} /> <Stack.Screen name="UserReviews" component={UserReviewsScreen} initialParams={{ category: null, IdUser, username}} options={({ route }) => ({ title: `Reseñas de ${route.params.category}` })} /> <Stack.Screen name="WorkersForm" initialParams={{IdUser, username}} component={WorkerFormScreen} options={{title: 'Subir oficio'}} /> <Stack.Screen name="User" component={UserScreen} initialParams={{ IdUser: null, username: null }} options={({ route }) => ({ title: `Perfil de ${route.params.username}`})} /> </Stack.Navigator>
WorkersRoot嵌套栈
<Stack.Navigator screenOptions={commonHeaderStyle}> <Stack.Screen name="WorkersCategories" component={CategoriesScreen} initialParams={{ type: 'trabajador' }} options={{title: 'Encontrar trabajador' }} /> <Stack.Screen name="Workers" component={WorkersScreen} initialParams={{ category: null }} /> </Stack.Navigator>
核心问题
从WorkersRoot下的Workers页面执行如下跳转:
navigation.navigate('ProfileRoot', { screen: 'User', params: { IdUser: worker.id_user, username: worker.username }})
- 点击返回按钮或Tab图标时,能正常回到ProfileRoot的初始Profile页面;
- 但切换到WorkersRoot Tab后再切回ProfileRoot Tab时,显示的是User页面而非预期的Profile页面,User页面未从ProfileRoot的栈中移除。
已尝试方案:每次从WorkersRoot跳转到ProfileRoot时使用dispatch重置导航
预期效果:Tab间切换时,各Tab的导航栈保持初始状态(切回ProfileRoot时显示Profile页面)
内容的提问来源于stack exchange,提问作者maximo rulli
相关产品推荐
相关产品推荐

