Flutter对接REST API构建ListView时出现类型不匹配与JSON解析错误如何解决
Flutter接口对接两类类型报错的修复方案
报错根因拆解
- 首个初始报错来源:接口返回的顶层JSON为键值对结构(即
{"data": [...]}的单对象格式),解析后得到的是单个PartnerList类型对象,而非List<PartnerList>类型的列表,函数返回类型声明和实际解析结果不匹配,触发类型不兼容提示。 - 二次修改后的新报错来源:为了匹配错误的返回类型声明,强行把
partnerListFromMap改成返回List<PartnerList>,用List.from直接解析顶层Map结构——Map是键值对集合,不是可遍历的数组结构,无法作为Iterable<dynamic>入参,因此触发类型转换异常。
具体修复操作
1. 回滚被错误修改的JSON解析方法
删除强行套List结构的错误解析逻辑,恢复适配顶层Map结构的正确解析代码:
// partnerList.dart 中保留正确的顶层解析逻辑 PartnerList partnerListFromMap(String str) => PartnerList.fromMap(json.decode(str)); String partnerListToMap(PartnerList data) => json.encode(data.toMap());
2. 修正fetchPartner函数的返回值声明
将函数返回类型从错误的Future<List<PartnerList>>调整为实际解析结果对应的Future<PartnerList>,修正后的完整接口请求代码:
// partner.api.dart 修正后的完整代码 import 'partnerList.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:http/http.dart' as http; Future<PartnerList> fetchPartner() async { SharedPreferences prefs = await SharedPreferences.getInstance(); final token = prefs.getString('token'); Map<String, String> requestHeaders = { 'Accept': 'application/json', 'Authorization': 'Bearer $token', }; final response = await http.get( Uri.parse("https://api.covin.in/partners/"), headers: requestHeaders ); if (response.statusCode == 200) { print(response.body); return partnerListFromMap(response.body); } else { throw Exception('Failed to load PartnerList'); } }
3. 增加POJO类的空值容错
原Datum类解析时对可空入参没有做防护,后端返回null值时会触发运行时错误,调整解析逻辑:
// Datum.fromMap 方法补充空判断 infos: json["infos"] == null ? Infos() : Infos.fromMap(json["infos"]), addressId: json["addressId"] == null ? null : json["addressId"], web: json["web"] == null ? null : json["web"],
4. ListView组件适配
接口请求完成后,直接通过PartnerList对象的data字段(即List<Datum>类型的合作方列表)渲染ListView即可,无需额外转换结构。
内容的提问来源于stack exchange,提问作者Joshi
相关产品推荐
相关产品推荐

