React Navigation找不到navigation对象报错修复方案
问题原因
- 报错
Couldn't find a navigation object. Is your component inside NavigationContainer?的核心原因是:你在根组件App里调用了useNavigation(),但App组件本身是包裹NavigationContainer的父组件,不在导航上下文的作用范围内,无法拿到有效的navigation实例。 - 报错
Can't find variable: navigation的原因是:如果直接删掉const navigation = useNavigation();的声明,headerRight点击回调里引用的navigation变量没有任何定义,自然会触发变量未找到的错误。
修复方法
React Navigation的Stack.Screen的options属性支持函数传参形式,函数入参会自动携带当前页面可用的navigation、route对象,不需要额外调用hook获取,直接使用即可,具体修改步骤:
- 删除App组件中无效的
const navigation = useNavigation();语句,同时可以删掉没用到的StackActions导入,减少无用代码。 - 将MAIN页面对应的
Stack.Screen的options配置从对象形式改为函数形式,从入参中解构出navigation供跳转逻辑使用。
修正后的核心代码片段如下:
export default function App() { return ( <NavigationContainer> <Stack.Navigator initialRouteName='MAIN'> <Stack.Screen name='MAIN' component={MainScreen} // options改为函数形式,直接从入参拿navigation options={({ navigation }) => ({ title:'', headerLeft:()=> <View> <Text style={{fontSize:25,marginLeft:30,marginTop:-5}}>성북구</Text> </View>, headerRight:()=> <TouchableOpacity onPress={() => navigation.navigate('DETAIL')}> <View> <Image source={search} style={{height: 30, width: 30,marginRight:20}}/> </View> </TouchableOpacity>, })} /> <Stack.Screen name="DETAIL" component={DetailScreen} options={{ title: '상세화면', headerBackTitleVisible: false, headerBackImage: BackBtn, headerTitle:()=>( <View> <TextInput placeholder={'어떤 것을 찾고 계신가요?'} style={styles.input} autoFocus></TextInput> </View> ) }}/> </Stack.Navigator> </NavigationContainer> ); }
补充说明:
useNavigationhook仅能在被Stack.Screen注册、处于NavigationContainer包裹范围内的子组件中使用,包裹导航容器的根组件无法通过该hook获取导航实例。如果是在Screen的options配置项中需要使用导航能力,优先使用options函数入参自带的navigation对象,是兼容性最好、最符合官方设计的写法。
内容的提问来源于stack exchange,提问作者yeinp
相关产品推荐
相关产品推荐

