调用API读取数据时遭遇_TypeError:_InternalLinkedHashMap<String, dynamic>不是List<dynamic>的子类型,求解决思路
解决思路:TypeError (type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List')
这个错误在Flutter/ Dart调用API时太常见了——说白了就是你的代码盼着接收一个List(列表)类型的数据,但API实际返回给你的却是一个Map(键值对字典),类型不匹配直接触发了这个报错。下面给你一步步拆解排查和解决的方法:
1. 先搞清楚API到底返回了啥
别猜,直接把API返回的原始数据打出来看真相!可以在请求代码里加一行打印,或者用调试工具抓包:
// 示例:打印API响应的原始内容 final response = await http.get(Uri.parse('你的目标API地址')); print('API返回的原始数据:${response.body}');
举个例子,如果返回的是这种结构:{"code":200, "data": [{"id":1, "title":"xxx"}, {"id":2, "title":"yyy"}]},那外层是Map,真正的列表数据藏在data字段里;但如果你的代码直接把整个响应结果当成List来解析,必然会报错。
2. 检查数据解析的逻辑是否错位
假设你之前的解析代码是这种错误写法:
// 错误示例:直接把整个Map转成List List<YourDataModel> dataList = List<YourDataModel>.from( json.decode(response.body).map((item) => YourDataModel.fromJson(item)) );
那正确的做法应该是先从Map里取出对应的List字段,再做解析:
// 正确示例:先拿Map里的List字段再解析 final Map<String, dynamic> responseMap = json.decode(response.body); List<YourDataModel> dataList = List<YourDataModel>.from( responseMap['data'].map((item) => YourDataModel.fromJson(item)) );
如果API返回的本身就是纯List(比如[{"id":1}, {"id":2}]),那你得反过来排查是不是代码里误把它当成Map来处理了。
3. 核对模型类的fromJson方法
还要确认你的数据模型类有没有写对,fromJson方法应该是接收单个Map来初始化的,比如:
class YourDataModel { final int id; final String title; YourDataModel({required this.id, required this.title}); factory YourDataModel.fromJson(Map<String, dynamic> json) { return YourDataModel( id: json['id'], title: json['title'], ); } }
要是fromJson方法错误地期望接收List,那也会触发类型不匹配的问题。
4. 调试时的小技巧:提前做类型判断
可以在解析前加个类型判断,避免直接报错,还能快速定位问题:
final decodedData = json.decode(response.body); if (decodedData is List) { // 走List类型的解析逻辑 } else if (decodedData is Map) { // 走Map类型的解析逻辑,取出里面的List字段 } else { print('API返回的数据类型完全不符合预期,请核对接口文档!'); }
内容的提问来源于stack exchange,提问作者Nicolas Poveda
相关产品推荐
相关产品推荐

