Dart/Flutter调用API获取数据报_TypeError类型不匹配如何修复?
问题成因
该报错属于Dart类型不匹配异常,触发原因如下:
- 你当前调用的API返回的响应体为
{}包裹的JSON对象结构,而非你代码预期的[]包裹的JSON数组结构 json.decode解析JSON对象后返回的实际运行时类型为_InternalLinkedHashMap<String, dynamic>,你直接将该Map类型的值赋值给声明为List类型的jsonResponse变量,违反了Dart的强类型校验规则,因此抛出异常。
修复方案
根据接口实际返回结构分为两种处理场景:
场景1:JSON对象的指定字段存储目标Data数组
如果接口返回结构类似下方示例,数组嵌套在对象的某个字段中:
{ "code": 200, "msg": "请求成功", "data": [ // 此处为你需要的Data列表内容 ] }
将代码调整为如下形式即可:
Future<List<Data>> fetchData() async { final response = await http.get( Uri.parse('link'), headers: headers); if (response.statusCode == 200) { // 先将解析结果转为Map类型 Map<String, dynamic> jsonResponse = json.decode(response.body); // 取出存储数组的字段,替换为你接口实际的数组字段名即可 List<dynamic> dataList = jsonResponse['data']; return dataList.map((data) => Data.fromJson(data)).toList(); } else { throw Exception('Unexpected error occured!'); } }
场景2:接口返回的是单个Data对象,不存在数组
如果接口本身就只返回单条Data数据,没有数组结构,需要修改方法返回类型和解析逻辑:
Future<Data> fetchData() async { final response = await http.get( Uri.parse('link'), headers: headers); if (response.statusCode == 200) { Map<String, dynamic> jsonResponse = json.decode(response.body); return Data.fromJson(jsonResponse); } else { throw Exception('Unexpected error occured!'); } }
内容的提问来源于stack exchange,提问作者doğan kısa
相关产品推荐
相关产品推荐

