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

Flutter类型转换错误:_Map<String,dynamic>无法转为List<dynamic>?求助

解决Flutter API数据解析的两类类型不匹配错误

第一个错误:_Map<String, dynamic> 无法转换为 List<dynamic>?

问题根源

API返回的响应体中,data字段是单个对象(Map类型):

{data: {id: 1, code: adc, date: 2023-04-29T00:00:00}}

但你的MarsatmasResponseModel中,data字段被定义为List<MarsatMas>?(列表类型),类型完全不匹配。调用response.data!.data!.first时,因为data根本不是列表,自然触发类型转换错误。

两种解决思路

思路1:调整模型匹配API返回结构(推荐)

既然通过ID获取数据本来就应该返回单个对象,直接修改模型定义:

class MarsatmasResponseModel {
  MarsatMas? data; // 从List<MarsatMas>?改为MarsatMas?

  MarsatmasResponseModel.fromJson(Map<String, dynamic> json) {
    data = json['data'] != null ? MarsatMas.fromJson(json['data']) : null;
  }
}

之后在getById方法中,直接使用response.data!.data!即可,无需调用first。

思路2:将单个对象包装为列表(兼容特殊API场景)

如果API设计存在不确定性(偶尔返回单个对象,偶尔返回列表),可以在解析时把单个Map包装成List:

class MarsatmasResponseModel {
  List<MarsatMas>? data;

  MarsatmasResponseModel.fromJson(Map<String, dynamic> json) {
    if (json['data'] != null) {
      if (json['data'] is List) {
        data = (json['data'] as List).map((e) => MarsatMas.fromJson(e)).toList();
      } else {
        // 单个对象转为列表
        data = [MarsatMas.fromJson(json['data'] as Map<String, dynamic>)];
      }
    }
  }
}

这种情况下,response.data!.data!.first就能正常工作。


第二个错误:函数类型无法赋值给模型实例类型

问题根源

你修改的parseModel是一个返回MarsatmasResponseModel的函数,但网络请求框架的parseModel参数要求的是**MarsatmasResponseModel的实例**,类型不匹配导致报错。

解决方法

根据你使用的网络框架(如Dio、Retrofit等)的参数要求调整:

  1. 如果框架需要模型实例:直接调用解析函数生成实例传入,而非传递函数本身。例如:
// 错误写法:传函数
// client.getById(id, parseModel: (json) => MarsatmasResponseModel.fromJson(json??{}))

// 正确写法:传解析后的实例
final json = ...; // 获取到的API响应json
client.getById(id, parseModel: MarsatmasResponseModel.fromJson(json??{}))
  1. 如果框架需要解析函数(接收json返回模型):检查函数参数类型是否匹配框架要求。例如框架期望的是MarsatmasResponseModel Function(Map<String, dynamic>),则调整你的函数参数为非空:
(Map<String, dynamic> json) => MarsatmasResponseModel.fromJson(json)

确保函数的参数类型和返回值类型与框架的parseModel参数定义完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:32:50