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

Flutter如何获取checklists与嵌套checklistResultItems列表?排查类型错误

问题分析与解决方案

错误本质

type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String' 核心原因是JSON字段类型和模型类定义的字段类型不匹配——你在反序列化时把一个JSON对象/数组(对应Dart里的Map/List)当成String类型解析了,大概率出在嵌套的checklistResultItems字段的定义或解析逻辑上。

第一步:对齐JSON结构与模型类

先确保你的JSON响应、模型类字段完全对应,以下是标准示例参考:

假设你的API返回JSON结构

{
  "taskDetails": {
    "checklists": [
      {
        "id": "CL001",
        "name": "设备巡检清单",
        "checklistResultItems": [
          {
            "itemId": "CRI001",
            "content": "电源接口是否松动",
            "isQualified": true
          }
        ]
      }
    ]
  }
}

正确的Dart模型类定义

// 顶层任务详情模型
class TaskDetailsModel {
  final List<CheckListModel> checklists;

  TaskDetailsModel({required this.checklists});

  factory TaskDetailsModel.fromJson(Map<String, dynamic> json) {
    // 把checklists数组转成模型列表
    final checklistList = json['checklists'] as List;
    final List<CheckListModel> parsedChecklists = checklistList
        .map((checklistJson) => CheckListModel.fromJson(checklistJson))
        .toList();
    return TaskDetailsModel(checklists: parsedChecklists);
  }
}

// 检查清单模型
class CheckListModel {
  final String id;
  final String name;
  final List<CheckListResultItemsModel> checklistResultItems;

  CheckListModel({
    required this.id,
    required this.name,
    required this.checklistResultItems,
  });

  factory CheckListModel.fromJson(Map<String, dynamic> json) {
    // 重点:不能把checklistResultItems当成String解析,要转成List再映射为模型
    final itemList = json['checklistResultItems'] as List;
    final List<CheckListResultItemsModel> parsedItems = itemList
        .map((itemJson) => CheckListResultItemsModel.fromJson(itemJson))
        .toList();
    return CheckListModel(
      id: json['id'],
      name: json['name'],
      checklistResultItems: parsedItems,
    );
  }
}

// 检查项结果模型
class CheckListResultItemsModel {
  final String itemId;
  final String content;
  final bool isQualified;

  CheckListResultItemsModel({
    required this.itemId,
    required this.content,
    required this.isQualified,
  });

  factory CheckListResultItemsModel.fromJson(Map<String, dynamic> json) {
    return CheckListResultItemsModel(
      itemId: json['itemId'],
      content: json['content'],
      isQualified: json['isQualified'],
    );
  }
}

常见错误排查点

  • 如果你在CheckListModel里把checklistResultItems定义成了String类型,直接赋值json['checklistResultItems']就会触发错误——因为JSON里它是数组,不是字符串。
  • 反序列化时忘记把嵌套数组转成模型对象列表,直接把Map赋值给了错误类型的字段。

第二步:正确的API请求与解析逻辑

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<TaskDetailsModel> fetchTaskDetails() async {
  final response = await http.get(Uri.parse('你的API接口地址'));
  
  if (response.statusCode == 200) {
    // 先把响应体转成Map,绝不能直接当成String处理
    final Map<String, dynamic> responseData = jsonDecode(response.body);
    // 解析顶层的taskDetails字段
    return TaskDetailsModel.fromJson(responseData['taskDetails']);
  } else {
    throw Exception('请求失败,状态码:${response.statusCode}');
  }
}

调用与数据获取示例

// 获取并处理数据
fetchTaskDetails().then((taskDetails) {
  // 获取外层checklists列表
  List<CheckListModel> allChecklists = taskDetails.checklists;
  // 遍历每个清单,获取嵌套的checklistResultItems
  for (var checklist in allChecklists) {
    List<CheckListResultItemsModel> items = checklist.checklistResultItems;
    // 这里可以处理每个检查项的逻辑
    print('清单${checklist.name}下有${items.length}个检查项');
  }
}).catchError((error) {
  print('解析错误:$error');
});

第三步:额外调试技巧

  • 打印jsonDecode(response.body)的完整结构,确认每个字段的实际类型(是String、List还是Map),和模型类字段严格对应。
  • 如果API返回的checklistResultItems可能为null,要在模型类里处理空值:比如把字段定义成List<CheckListResultItemsModel>?,并在fromJson里判断json['checklistResultItems']是否为null,为空则返回空列表或null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:45:38