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

