Dart/Flutter解析JSON时List<dynamic>与List<String>类型不匹配错误
问题排查与修复方案
第一个错误:Field '_survey@xxxx'未初始化
原因
getParsedData是同步方法,但内部调用的_getData是异步加载JSON的方法——调用_getData后代码会直接跳到return _survey,这时候异步加载还没完成,_survey根本没被赋值,而late修饰的变量必须在使用前初始化,所以触发了这个错误。
修复
把getParsedData改成异步方法,同时调整调用逻辑,确保数据加载完成后再跳转页面:
- 把
SurveyUtilities里的_survey改成可空类型,避免late带来的初始化问题 getParsedData返回Future<SurveyData>,内部等待_getData完成后再返回数据- 调用时用
await等待数据加载完成
第二个错误:type 'List' is not a subtype of type 'List'
原因
JSON解析出来的数组默认是List<dynamic>类型,直接赋值给List<String>类型的questions,Dart不会自动做类型转换,所以报类型不匹配的错误。
修复
在SurveyData.fromJson构造函数里,把json['questions']强制转换为List<String>,可以用cast<String>()方法快速转换。
修正后的完整代码
SurveyData类
class SurveyData { String title = ""; String description = ""; List<String> questions = []; SurveyData({required this.title, required this.description, required this.questions}); SurveyData.fromJson(Map<String, dynamic> json) : title = json['title'] ?? "", // 增加空值兜底,避免JSON字段缺失报错 description = json['description'] ?? "", questions = (json['questions'] as List).cast<String>(); // 转换为List<String> }
SurveyUtilities类
class SurveyUtilities { SurveyData? _survey; // 改为可空类型,避免late初始化问题 /// 从本地资源加载并解析问卷数据 Future<void> _getData(String location) async { var json = await rootBundle.loadString(location); Map<String, dynamic> parsed = jsonDecode(json); _survey = SurveyData.fromJson(parsed); } /// 获取解析后的问卷数据(异步方法) Future<SurveyData> getParsedData(String location) async { // 缓存逻辑:如果已经加载过,直接返回,避免重复加载 if (_survey == null) { await _getData(location); } return _survey!; } }
调用代码
GestureDetector( child: const Text( "参与问卷调查", style: TextStyle( fontSize: 16.0, color: Colors.blueGrey, decoration: TextDecoration.underline, ), ), onTap: () async { // 等待数据加载完成 final surveyData = await sUtil.getParsedData(survey.location); Navigator.push( context, MaterialPageRoute( builder: (context) => SurveyPage(data: surveyData), ), ); }, )
内容的提问来源于stack exchange,提问作者Miriana
相关产品推荐
相关产品推荐

