flutter中利用json_model生成的model类如何快速构造"泛"对象?
意思可能表达的不清楚,举个例子,在dio中返回的json中我们希望通过消息直接返回需要的对象,而不是返回到调用处再去用json构造成需要的对象.
// 原来从服务器中我们的返回方式
var response = await dio.get<String>(
"user",
);
Map<String,dynamic> rdata = json.decode(response.data);
从服务器返回user的json格式再用model.fromJson方式构造,这样会造成异常处理的麻烦,比如我们现在无法返回user而是返回了一个error,告诉客户端用户被锁定了.这个时候上面的代码返回后就需要做业务判断…感觉这样写起来有些繁琐.如果能用一个message类用来包装返回一个消息模型我觉得是不是更好一些?由于json_model生成的模型只需要传一个model然后返回model.fromJson的工厂方法就可以了.不过这需要用到了类的反射机制…
可是flutter并不支持反射…于是我用了以下方式变通了一下,记录下来:
// 定义定义服务器返回对象
class JsonResponse{
final Map<String,dynamic> data;
JsonResponse(jsonData):data = json.decode(jsonData);
}
//定义好服务器返回的消息包装器
class MsgType<T> {
final int status;
final String message;
final JsonResponse response;
final Map<String,dynamic> data;
T model;
MsgType(JsonResponse response):
status = response.data['status'],
message = response.data['msg'],
data = response.data['data'],
response = response;
T getModel(T ts){
model = ts;
return ts;
}
}
//于是就可以在应用的场景这样调用了
MsgType<User> msgType = MsgType(JsonResponse(r.toString()));
if(msgType.status == 200){
msgType.getModel(User.fromJson(msgType.data));
print(jsonEncode(msgType.model));//这里存的就是User实例了.
...
}
if(msgType.status == 400){
toast(msgType.message);
}