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

Flutter使用http调用API时HashMap无法转SubjectList类型报错如何解决

错误原因

你出现的类型不匹配报错由两个核心问题导致:

  1. json.decode()执行后返回的是原始的Map<String, dynamic>结构,你没有调用自定义的fromMap转换方法,直接将Map类型赋值给SubjectList类型变量,触发了类型校验报错。
  2. 接口返回的data字段是科目数组,你当前定义的网络请求方法返回单个SubjectList类型不符合实际数据结构,且模型命名存在语义混淆:你定义的SubjectList实际对应的是单条科目数据,并非列表。

修正方案

1. 调整模型语义(可选但推荐)

将原SubjectList模型重命名为Subject,对应单条科目数据,避免后续混淆:

class Subject {
  Subject({
    this.subject,
    this.score,
    this.progress,
  });

  String? subject;
  double? score;
  String? progress;

  factory Subject.fromMap(Map<String, dynamic> json) => Subject(
        subject: json["subject"],
        score: json["score"].toDouble(),
        progress: json["progress"],
      );

  Map<String, dynamic> toJson() => {
        "subject": subject,
        "score": score,
        "progress": progress,
      };
}

如果你不想修改模型名称,后续直接把示例中的Subject替换为SubjectList即可。

2. 修正网络请求方法的返回类型与解析逻辑

将请求方法返回值改为Future<List<Subject>>,解析时先提取外层data数组,再遍历转换为模型对象,同时增加基础的响应状态校验:

Future<List<Subject>> getSubjectList(
    String userId, String accountId) async {
  final response = await http
      .get(Uri.https(_baseUrl, 'v1/package/subject-details'), headers: {
    'Content-Type': 'application/json',
    'user-id': userId,
    'account-id': accountId,
  });
  // 先校验接口请求是否成功
  if (response.statusCode == 200) {
    final Map<String, dynamic> responseMap = json.decode(response.body);
    // 校验业务返回状态成功
    if (responseMap['success'] == true) {
      // 提取data数组,遍历转换为Subject模型
      final List<dynamic> dataList = responseMap['data'];
      return dataList.map((item) => Subject.fromMap(item)).toList();
    }
  }
  // 异常场景按需处理,比如返回空列表或抛出异常
  return [];
}

3. 可选兼容处理

如果存在score字段返回null的场景,可以把fromMap中的score赋值逻辑调整为兼容写法,避免空指针:

score: json["score"]?.toDouble(),

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:06:00