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

Flutter Get请求报错:类型不匹配问题求助

解决Flutter Get请求中的_TypeError错误

错误原因

你遇到的_TypeError (type '(dynamic) => dynamic' is not a subtype of type '(String, dynamic) => MapEntry<dynamic, dynamic>' of 'transform')错误,核心原因是原代码错误地将API返回的Map对象当成List处理:

  • API返回的是包含data字段的Map结构,你直接对整个响应对象调用map方法,而Map的map方法要求的转换函数类型是(String, dynamic) => MapEntry,但你传入的(x) => fromJson(x)是List的map所需的(dynamic) => dynamic类型,类型不匹配导致报错。

针对性修复方案

根据API返回的data字段是单个对象还是数组列表,分别调整代码:

场景1:API返回的data是单个对象

如果接口返回的data是单条记录(比如{"data": {"id": 1, "name": "xxx"}}),修改代码如下:

Future<T?> get([dynamic search]) async {
  var url = "$_baseUrl$_endpoint";

  if (search != null) {
    String queryString = getQueryString(search);
    url = "$url?$queryString";
  }

  var uri = Uri.parse(url);
  Map<String, String> headers = createHeaders();
  var response = await http!.get(uri, headers: headers);

  if (isValidResponseCode(response)) {
    var responseData = jsonDecode(response.body);
    var data = responseData['data'];
    // 直接返回动态数据,或根据泛型转换
    return data as T?;
  } else {
    throw Exception("请求失败,请稍后重试");
  }
}

调用示例:

// 指定泛型为Map<String, dynamic>,直接通过key取值
var result = await yourProvider.get<Map<String, dynamic>>();
print(result?['id']);

场景2:API返回的data是数组列表

如果接口返回的data是多条记录的数组(比如{"data": [{"id":1}, {"id":2}]}),修改代码如下:

Future<List<T?>> get([dynamic search]) async {
  var url = "$_baseUrl$_endpoint";

  if (search != null) {
    String queryString = getQueryString(search);
    url = "$url?$queryString";
  }

  var uri = Uri.parse(url);
  Map<String, String> headers = createHeaders();
  var response = await http!.get(uri, headers: headers);

  if (isValidResponseCode(response)) {
    var responseData = jsonDecode(response.body);
    List<dynamic> dataList = responseData['data'];
    // 转换为指定泛型的列表
    return dataList.cast<T?>();
  } else {
    throw Exception("请求失败,请稍后重试");
  }
}

调用示例:

// 指定泛型为Map<String, dynamic>,遍历列表取值
var resultList = await yourProvider.get<Map<String, dynamic>>();
print(resultList[0]?['id']);

额外建议

如果你不需要泛型支持,也可以直接将返回类型改为Future<Map<String, dynamic>>或Future<List<Map<String, dynamic>>>,避免泛型类型转换的潜在问题,代码会更简洁直接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:18:13