问题情况
本来按照书上的思路都封装好了Dio,半自动生成了Json Model,结果在实际应用上出现了以下异常:
Unhandled Exception: type 'String' is not a subtype of type 'Map<String, dynamic>'
该异常指向了我进行Json Model化的代码:(User为自己编写的Json Model类)
Response res = await dio.get<String>(...);
return User.fromJson(res.data); // 异常指向了这一行
分析原因:
初步分析是User.fromJson()需要传入Map而res.data的数据类型是String,但是用User.fromJson(res.data as Map<String, dynamic>)
这样的写法依然不行。
后来翻书找到了原因,在JSON序列化之前需要用json.decode(json)将String转换为Map,例如:
Map userMap = json.decode(json);
var user = new User.fromJson(userMap);
解决方法
对res.data进行jsonDecode,原代码改成以下代码解决:
return Recommender.fromJson(jsonDecode(res.data));
后续发现的真问题所在和避免方法
后续写的代码发现dio.get(...)
不用泛型指明返回类型也会报错。
该异常情况主要是与dio.get方法的返回值有关,如果是dio.get(...)
这样使用的话它可能返回String也可能返回Map,所以建议指定泛型来避免异常,例如指定返回String则这样使用:dio.get<String>(...)
,实际使用代码如下:
Response res = await dio.get("url");
return User.fromJson(jsonDecode(res.data));
注:
本文所使用的环境和依赖:
environment:
sdk: ">=2.12.0 <3.0.0"
dependencies:
...
dio: ^4.0.0
json_annotation: ^4.0.1
dev_dependencies:
...
build_runner: ^2.0.1
json_serializable: ^4.1.1
版权属于: Kerrinz
本文链接:https://kerrinz.com/archives/103.html
作品采用《知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议》进行许可,转载请务必注明出处!