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

使用Dio获取数据报错:List无法转为String,原http请求正常

Dio请求后模型解析类型错误解决

问题情况

之前使用http包可正常获取并解析数据,改用Dio包后返回数据时触发类型错误,报错信息:

_TypeError (type 'List' is not a subtype of type 'String')

报错位置在请求方法的json变量处。

相关代码

请求方法代码:

Future<List<Post>?> getProducts() async {
  try {
    var response = await Dio().get('https://fakestoreapi.com/products');
    var json = response.data;

    if (response.statusCode == 200) {
      return postFromJson(json);
    } else {
      throw Exception("Error");
    }
  } catch (e) {
    throw (e);
  }
}

模型文件代码:

List<Post> postFromJson(String str) =>
    List<Post>.from(json.decode(str).map((x) => Post.fromJson(x)));

原因分析

http包返回的response.body是未解析的原始JSON字符串,需要手动调用json.decode()解析成List/Map;但Dio会自动将响应的JSON数据解析为对应的List或Map对象,无需再手动解码。而你的postFromJson函数要求接收String类型参数,内部还执行json.decode(str),此时传入的是Dio已解析好的List对象,导致类型不匹配报错。

解决方案

推荐直接修改模型的解析函数,适配Dio自动解析的结果:

List<Post> postFromJson(dynamic data) =>
    List<Post>.from(data.map((x) => Post.fromJson(x)));

如果不想修改模型函数,也可以将Dio的响应数据转为字符串后传入(不推荐,多一次编码解码操作):

return postFromJson(jsonEncode(response.data));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:27:32