Flutter 颤振/飞镖中的泛型反序列化

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

我正在尝试编写一个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;
}
我想要的是制作一个通用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(){…}
谢谢-我不能让它正常工作。当我这样做时,会调用空的扩展方法,但不会调用重写。知道为什么吗?