React Native报错navigation.getParam is not a function如何解决?
错误原因
- 函数组件无
this指向:你当前编写的MenuDetailScreen是函数式组件,不存在类组件的this实例,代码中this.navigation本身就是undefined,调用方法自然会报错,且你已经在组件入参中解构出了navigation对象,不需要额外加this前缀。 getParamAPI已废弃:你使用的React Navigation版本为v5及以上,该版本起官方已经完全移除了navigation.getParam方法,统一使用route.params来获取路由跳转时传递的参数。
解决方案
- 给组件入参新增
route参数,React Navigation会自动注入该对象,所有跳转传递的参数都存储在route.params中。 - 替换参数获取逻辑,增加可选链兜底,避免参数未传递时出现报错。
- 可额外增加参数为空时的兜底展示,避免页面白屏。
修改后完整代码
import React from 'react'; import { StyleSheet, Text, View, FlatList, TouchableOpacity, Image, ActivityIndicator } from 'react-native'; import { Card, Rating } from 'react-native-elements' import { MaterialCommunityIcons } from '@expo/vector-icons'; import { dishesData } from './DishesData'; const MenuDetailScreen = ({ navigation, route }) => { // 替换原getParam逻辑,用route.params获取参数,加可选链兜底 const dish = dishesData.find( (dish) => dish.id === route.params?.id ); // 增加兜底逻辑,找不到对应菜品时展示加载状态 if(!dish) { return <View style={styles.container}><ActivityIndicator size="large" color="blue" /></View> } return ( <View style={styles.container}> <Card> <Card.Title style={styles.titleTextStyle}>{dish.title}</Card.Title> <Image style={{ height: 300, width: 350 }} source={{ uri: dish.imageSource }} /> </Card> <Card> <View style={{ flexDirection: "row" }}> <Text style={styles.commentsTextStyle}>Comments</Text> <View style={{ flexGrow: 1 }} /> <TouchableOpacity style={{ paddingBottom: 8 }} > <MaterialCommunityIcons name="pencil-circle" size={40} color="blue" /> </TouchableOpacity> </View> <FlatList scrollEnabled={false} data={dish.dishDetails} keyExtractor={(item) => item.id.toString()} renderItem={({ item }) => { return ( <View> <Text style={styles.headerTextStyle}>{item.comment}</Text> <Rating readonly imageSize={20} startingValue={item.rating} style={styles.ratingStyle} /> <Text style={styles.spacing}>- {item.author} , {item.created_by}</Text> </View> ); }} /> </Card> </View> ); }; const styles = StyleSheet.create({ container: { flex: 1, paddingBottom: 10, justifyContent: 'center' }, commentsTextStyle: { fontSize: 20, fontWeight: 'bold', textAlign: 'left' }, textInputStyle: { width: "80%", padding: 8, marginBottom: 8, fontSize: 16 }, submitButtonStyle: { alignItems: 'center', width: "80%", borderRadius: 5, marginBottom: 8, padding: 8, fontWeight: 'bold', backgroundColor: 'rgba(0, 0, 255, 0.6)', color: 'black' }, cancelButtonStyle: { alignItems: 'center', width: "80%", borderRadius: 5, marginBottom: 8, padding: 8, fontWeight: 'bold', backgroundColor: 'grey', color: 'black' }, ratingStyle: { alignItems: 'flex-start', paddingBottom: 8 }, titleTextStyle: { fontSize: 20, textAlign: 'left' }, textStyle: { paddingBottom: 8 }, headerTextStyle: { fontSize: 16, fontWeight: 'bold', paddingTop: 8 }, spacing: { padding: 8 }, ratingStyle: { alignItems: 'flex-start', paddingTop: 8 } }); export default MenuDetailScreen;
补充说明
确保你首页跳转的代码正确传递了id参数,示例如下:
// 首页FlatList的条目点击逻辑 <TouchableOpacity onPress={() => navigation.navigate('MenuDetail', { id: 当前条目的菜品id })}> {/* 条目内容 */} </TouchableOpacity>
内容的提问来源于stack exchange,提问作者kathir
相关产品推荐
相关产品推荐

