Flutter 颤振/飞镖中的泛型反序列化
我正在尝试编写一个HTTP驱动程序类,它接受一个泛型类并反序列化响应。我还没有找到一个好的,干净的方法来做这件事 我定义了如下数据模型类:Flutter 颤振/飞镖中的泛型反序列化,flutter,dart,deserialization,Flutter,Dart,Deserialization,我正在尝试编写一个HTTP驱动程序类,它接受一个泛型类并反序列化响应。我还没有找到一个好的,干净的方法来做这件事 我定义了如下数据模型类: class MyClass { String field1; String field2; MyClass.fromJson(Map<dynamic, dynamic> json) : field1 = json["field1"], field2 = json["field2
class MyClass {
String field1;
String field2;
MyClass.fromJson(Map<dynamic, dynamic> json)
: field1 = json["field1"],
field2 = json["field2"];
}
void makeRequest<T>() {
Response response = http.get(url);
T parsed = T.fromJson(jsonDecode(response.body));
return parsed;
}
我想要的是制作一个通用HTTP驱动程序,如下所示:
class MyClass {
String field1;
String field2;
MyClass.fromJson(Map<dynamic, dynamic> json)
: field1 = json["field1"],
field2 = json["field2"];
}
void makeRequest<T>() {
Response response = http.get(url);
T parsed = T.fromJson(jsonDecode(response.body));
return parsed;
}
void makeRequest(){
Response=http.get(url);
T parsed=T.fromJson(jsonDecode(response.body));
返回解析;
}
有没有办法在颤振/飞镖中做到这一点?我一直在试图找出使用基类和扩展的正确语法,但还没有找到它。有什么想法吗?这是我通常在网络通话中使用的,请随意使用。顺便说一句,我推荐该包提供方便的标题和参数配置,以及其他错误处理功能
//定义扩展名
基于类型的扩展模型{
fromJson(映射数据){}
}
//对于单个对象
未来makeGetRequest({String url,Map params}){
返回http
.get(buildUrl(url,params))//如果使用Dio,则不需要buildUrl()
.然后((响应)=>handleJsonResponse(响应))
.然后((数据)=>T.fromJson(数据));
//用于对象列表
未来的makeGetRequestForList({String url,Map params}){
返回http
.get(buildUrl(url,params))//如果使用Dio,则不需要buildUrl()
.然后((响应)=>handleJsonResponse(响应))
.然后((数据)=>List.from(数据.map((项)=>T.fromJson(项));
}
//没有Dio的助手类
字符串构建url(字符串url,[映射参数]){
最终stringBuilder=StringBuffer(url);
if(参数?.isNotEmpty==true){
stringBuilder.write(“?”);
parameters.forEach((key,value)=>stringBuilder.write('$key=$value&');
}
最终结果=stringBuilder.toString();
打印(结果);
返回结果;
}
//使用Dio,您只需执行以下操作:
最终结果=等待API().dio
.get(url,queryParameters:params)//此处不需要[buildUrl]
.然后((响应)=>handleJsonResponse(响应))
.然后((数据)=>T.fromJson(数据));
//处理JSON响应
handleJsonResponse(http.Response响应,[字符串端点=“”]){
印刷品(
'API:$endpoint\n代码:${response.statusCode}\n正文:${response.body}');
if(_okStatus.contains(response.statusCode)){
返回jsonDecode(response.body);
}
if(response.statusCode==HttpStatus.unauthorized){
抛出异常(response.statusCode);
}否则{
抛出异常(“HTTP:${response.statusCode}${response.body}”);
}
}
用法:
// Example class
class Post {
final String title;
Post({this.title});
@override
Post.fromJson(Map<String, dynamic> data) : title = data['title'];
}
// Use the function
Future<Post> getPost() async {
final result = await makeGetRequest<Post>(params: {'post_id': 1});
return result;
}
//示例类
班岗{
最后的字符串标题;
Post({this.title});
@凌驾
fromJson(地图数据):title=data['title'];
}
//使用函数
Future getPost()异步{
最终结果=等待makeGetRequest(参数:{'post_id':1});
返回结果;
}
void makeRequest(){…}
谢谢-我不能让它正常工作。当我这样做时,会调用空的扩展方法,但不会调用重写。知道为什么吗?