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
相关产品推荐
相关产品推荐

