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

Flutter本地读取JSON文件报Undefined name错误如何解决

问题原因说明
  • 第一个Undefined name 'breakfast'报错:你在组件中直接使用了未声明、未传入的变量名breakfast,程序运行时找不到对应标识符所以抛出异常。
  • 第二个Instance member '...' can't be accessed using static access报错:你替换成类名Breakfast后,是直接用类去访问了只有实例化对象才能调用的非静态属性/方法,Dart里非静态的成员属于类的实例,不属于类本身,不能直接通过类名调用。
解决步骤
  1. 先完成基础资源声明和JSON解析逻辑
    首先在pubspec.yaml中声明本地JSON文件的资源路径,示例:
assets:
  - assets/breakfast.json

加载解析JSON为Breakfast实例的示例代码:

import 'dart:convert';
import 'package:flutter/services.dart';
import '你存放Breakfast数据模型的文件路径.dart';

Future<Breakfast> loadBreakfastData() async {
  final String jsonStr = await rootBundle.loadString('assets/breakfast.json');
  final jsonData = json.decode(jsonStr);
  return Breakfast.fromJson(jsonData);
}
  1. 给BreakfastCard组件新增实例参数
    在你的BreakfastCard组件中定义必填的Breakfast类型实例参数,不要直接用类名访问属性:
class BreakfastCard extends StatelessWidget {
  // 声明接收Breakfast实例参数,参数名用小写breakfast
  final Breakfast breakfast;
  const BreakfastCard({super.key, required this.breakfast});

  @override
  Widget build(BuildContext context) {
    return Card(
      // 访问属性时用传入的实例对象breakfast调用即可
      child: Text(breakfast.foodName),
    );
  }
}
  1. 调用组件时传入解析好的实例
    在页面中加载完JSON得到Breakfast实例后,传给BreakfastCard即可正常使用:
// 假设你已经通过loadBreakfastData方法拿到了解析完成的实例对象currentBreakfast
BreakfastCard(breakfast: currentBreakfast)

内容的提问来源于stack exchange,提问作者Gheh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:24:02