Flutter结合自定义模型接入API数据至charts图表时的类型错误求助
报错根因说明
当前抛出的type 'List<dynamic>' is not a subtype of type 'List<Ages>'错误,核心触发原因是Dart静态类型检查不支持从原始动态列表直接强转为自定义模型列表:json.decode方法默认返回的根类型为dynamic,若直接将返回值强制转换为List<Ages>,运行时只会校验列表根节点的类型标识,不会自动对列表内的每个元素执行你在Ages类中定义的fromJson解析逻辑,因此会出现类型不匹配的运行时报错。
可直接落地的修复方案
- 调整接口数据解析流程,替换错误的强转逻辑
避免直接使用类似json.decode(response.body) as List<Ages>的写法,严格按照「解码原始值→转基础动态列表→逐元素调用模型解析方法→生成强类型列表」的流程实现转换,参考代码:// 错误写法(触发当前报错) Future<List<Ages>> fetchAgesData(String apiUrl) async { final response = await http.get(Uri.parse(apiUrl)); // 直接强转根列表,不会自动解析内部元素 return json.decode(response.body) as List<Ages>; } // 正确写法 Future<List<Ages>> fetchAgesData(String apiUrl) async { final response = await http.get(Uri.parse(apiUrl)); // 先将根节点转为基础动态列表 final rawJsonList = json.decode(response.body) as List<dynamic>; // 逐元素调用fromJson完成类型转换 return rawJsonList.map((jsonItem) => Ages.fromJson(jsonItem as Map<String, dynamic>)).toList(); } - 打通组件间的类型传递链路
确保异步请求方法的返回值为最终完成类型转换的List<Ages>,不要将json.decode返回的原始动态值直接透传给FutureBuilder、AgeCharts或ShowChart组件,从链路源头避免动态类型残留。 - 增加运行时结构校验
在逐元素解析的逻辑中增加类型判断,兼容接口临时返回异常结构的场景,减少额外运行时错误:return rawJsonList.whereType<Map<String, dynamic>>().map((jsonItem) => Ages.fromJson(jsonItem)).toList();
高频踩坑提醒
- 不要依赖Dart的
as强转语法跳过元素级别的模型解析,强转操作仅能匹配已有对应类型的对象,无法将Map结构的JSON对象自动转换为自定义模型实例。 - 若项目启用了Dart的空安全与严格类型检查,不要将未完成类型转换的动态列表传递给需要
List<Ages>参数的图表组件,否则会在编译或运行阶段触发类型不匹配问题。
内容的提问来源于stack exchange,提问作者Ricky Reza Muhammad
相关产品推荐
相关产品推荐

