You need to enable JavaScript to run this app. Flutter结合自定义模型接入API数据至charts图表时的类型错误求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 13:36:04