You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native报错navigation.getParam is not a function如何解决?

错误原因
  • 函数组件无this指向:你当前编写的MenuDetailScreen是函数式组件,不存在类组件的this实例,代码中this.navigation本身就是undefined,调用方法自然会报错,且你已经在组件入参中解构出了navigation对象,不需要额外加this前缀。
  • getParamAPI已废弃:你使用的React Navigation版本为v5及以上,该版本起官方已经完全移除了navigation.getParam方法,统一使用route.params来获取路由跳转时传递的参数。
解决方案
  1. 给组件入参新增route参数,React Navigation会自动注入该对象,所有跳转传递的参数都存储在route.params中。
  2. 替换参数获取逻辑,增加可选链兜底,避免参数未传递时出现报错。
  3. 可额外增加参数为空时的兜底展示,避免页面白屏。
修改后完整代码
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:54:02