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
相关产品推荐
相关产品推荐

