You need to enable JavaScript to run this app. Flutter对接REST API构建ListView时出现类型不匹配与JSON解析错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 14:06:00