You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter调用REST API GET请求报错期望List却得到_JsonMap如何解决

问题原因

你代码的错误出在接口请求service的类型强转逻辑:后端返回的分页接口响应不是直接的Unit数组,而是包含分页信息、响应状态、数据列表的JSON对象(也就是报错里提到的_JsonMap类型),但你直接把解码后的结果强制转换为List类型,因此触发类型不匹配报错。

解决步骤
  1. 先打印接口返回的原始响应内容确认结构
    把你service代码中注释掉的print(response.body);打开,运行接口请求后查看控制台输出的JSON结构,确认存放Unit列表的字段名称,常见的字段名有data、list、records、rows等。
    举个常见的分页接口响应结构示例:
{
  "code": 200,
  "message": "请求成功",
  "page": 1,
  "total": 50,
  "data": [
    {"id": "1", "name": "千克", "baseUnit": "g", "baseValue": 1000},
    // 其余Unit数据...
  ]
}
  1. 修改service代码的解析逻辑
    先将响应解码为Map类型,再取出存放列表的字段做后续转换即可,修改后的代码示例如下(请将示例中的data字段替换为你接口实际的列表字段名):
Future < List < Unit >> search(searchText, page) async {
  var searchUrl = "${ApiEndPoint.baseUrl}/unit?q=$searchText&page=$page";
  var response = await http.get(
    Uri.parse(searchUrl),
    headers: {
      "Content-Type": "application/json"
    },
  );
  // 先解析为Map类型
  final responseJson = convert.json.decode(response.body) as Map<String, dynamic>;
  // 取出存放列表的字段转换为List
  final units = responseJson['data'] as List;
  final List<Unit> unitList = units.map((item) => Unit.fromJson(item)).toList();
  return unitList;
}
可选优化

可以增加判空逻辑,避免接口返回列表字段为空时触发异常:

final units = responseJson['data'] as List? ?? [];

内容的提问来源于stack exchange,提问作者Emmon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:18:00