React Native传递导航至函数报错:null不是对象
React Native 导航参数为null导致TypeError的解决方法
问题根源
你在getLoggedOutScreens里调用testViews(null, false),把null传给了tabNavigation参数,而renderBackToDashboard里直接调用tabNavigation.navigate,这就触发了null is not an object evaluating tabNavigation.navigate错误。之前尝试的几种传参方式都没命中正确的导航实例,所以没解决问题。
解决步骤
1. 传递封装好的RootNavigation实例
你已经在RootNavigation.ts里封装了RootNavigation类实例,它自带navigate方法,直接把它传给testViews即可:
- 首先在当前文件导入
RootNavigation:
import { NavigationRef, RootNavigation } from './RootNavigation';
- 修改
getLoggedOutScreens里的调用:
const getLoggedOutScreens = () => { return ( <Stack.Navigator screenOptions={defaultOptions}> <Stack.Screen name={SCREEN_NAMES.AUTH} component={AuthScreen} options={{ headerShown: false }} /> {testViews(RootNavigation, false)} {/* 这里传RootNavigation */} <Stack.Screen name={SCREEN_NAMES.MY_SCREEN} component={MyScreen} options={{ title: t('myScreen') }} /> </Stack.Navigator> ); };
2. 添加空值保护(可选但推荐)
为了避免后续再出现类似空值调用的问题,在renderBackToDashboard里给navigate调用加上可选链:
const renderBackToDashboard = (tabNavigation: any) => { return <HeaderBackButton tintColor={defaultOptions.headerTintColor||'white'} labelVisible={defaultOptions.headerBackTitleVisible||false} onPress={() => { tabNavigation?.navigate(SCREEN_NAMES.DASHBOARD_TAB); }} {/* 加?. */} /> }
为什么之前的尝试无效
testViews(NavigationRef, false):NavigationRef是React的Ref对象,本身没有navigate方法,只有current属性才指向导航实例testViews(NavigationRef.current, false):执行getLoggedOutScreens时,NavigationContainer还没完成挂载,NavigationRef.current此时还是nulltestViews({NavigationRef}, false):传递的是包含Ref对象的普通对象,不是具备navigate方法的导航实例
内容的提问来源于stack exchange,提问作者Anarkie
相关产品推荐
相关产品推荐

