React Native:useNavigation返回对象不一致致openDrawer失效问题
问题原因
你的导航结构存在重复注册页面的问题:
Dashboard、History既作为 Drawer Navigator 的子页面,又单独注册为 Stack Navigator 的独立页面- 首次加载时,
Dashboard是通过Root(Drawer Navigator)渲染的,处于抽屉导航的上下文内,所以useNavigation能拿到抽屉相关的方法(openDrawer等) - 当你用
navigation.navigate('Dashboard')跳转时,实际是直接打开了 Stack Navigator 下的独立Dashboard页面,这个页面不在抽屉导航的上下文里,自然没有抽屉相关的方法
解决方案
1. 清理重复的页面注册
把 Stack Navigator 里重复的 Dashboard、History 页面删掉,这些页面已经属于 Drawer Navigator,不需要在 Stack 里单独注册:
export default function App() { return ( <PaperProvider> <NavigationContainer > <View style={styles.container}> <Stack.Navigator screenOptions={{headerShown:false}}> <Stack.Screen options={{headerShown:false}} name="Root" component={Root} /> {/* 只保留不在 Drawer 中的页面,比如登录页 Home(如果需要的话) */} <Stack.Screen name="Home" component={Home} /> </Stack.Navigator> </View> </NavigationContainer> </PaperProvider> ); }
2. 统一导航方式
在需要跳转回 Dashboard 或其他 Drawer 内页面时,使用 Drawer 中定义的页面名称进行导航,确保是在抽屉上下文内跳转:
// 比如在 History 页面跳转回 Dashboard navigation.navigate('ראשי'); // 对应 Drawer.Screen 中 name="ראשי" 的 Dashboard 页面
3. 优化导航类型(可选)
避免使用 any 类型,明确导航参数类型,提升代码安全性:
// 定义 Drawer 的参数列表类型 type DrawerParamList = { 'ראשי': undefined; 'היסטוריית קריאות': undefined; 'התנתק': undefined; }; export default function Dashboard({navigation}: {navigation: DrawerNavigationProp<DrawerParamList>}) { // 直接使用 props 中的 navigation,无需额外调用 useNavigation return ( <View> {/* ... */} <TouchableOpacity onPress={() => navigation.openDrawer()} style={styles.hamburgerIconWrapper}> <Icon name="menu" size={32}/> </TouchableOpacity> {/* ... */} </View> ); }
内容的提问来源于stack exchange,提问作者Sher Mi
相关产品推荐
相关产品推荐

