Http 处理颤振中服务器响应的通用类

Http 处理颤振中服务器响应的通用类,http,flutter,dart,Http,Flutter,Dart,我正在呼叫请求服务器获取数据,并得到以下响应 { "success": 1, "data": [ { "id": 1, "name": "Kurti" }, { "id": 2, "name": "Top" } ], "message": "Data fetched" } 用于转换来自服务器的json数据的模态类 class Product { String categoryName; int

我正在呼叫请求服务器获取数据,并得到以下响应

{
  "success": 1,
  "data": [
    {
      "id": 1,
      "name": "Kurti"
    },
    {
     "id": 2,
     "name": "Top"
    }
  ],
  "message": "Data fetched"
}
用于转换来自服务器的json数据的模态类

class Product {

  String categoryName;
  int productId;

  Product.fromJson(Map<String, dynamic> json) {

    categoryName = json["id"];
    productId = json["name"];    
  } 
}
类产品{
字符串类别名称;
int-productId;
Product.fromJson(映射json){
categoryName=json[“id”];
productId=json[“name”];
} 
}
因此,从服务器的格式将是固定的每一个调用如下

{
   "success": <Int>,
   "message": <String>,
   "data": <An array of Model class>
}
{
“成功”:,
“信息”:,
“数据”:
}
因为我在课堂下创造了

class ServerResponse<T> {

 String message;
 int success;
 List<T> data;

 ServerResponse.fromJson(Map<String, dynamic> json) {

    message = json["message"];
    success = json["success"];
    data = json["product_data"];
  }
}
class服务器响应{
字符串消息;
成功;
列出数据;
ServerResponse.fromJson(映射json){
message=json[“message”];
success=json[“success”];
data=json[“产品数据”];
}
}
这就是我调用api的方式

class ServerManager {

  final baseUrl = isProduction ? liveServer : stagingServer;

  var headers = {"consumer-key": "sdfgdqwrtw34563t545"};

  dynamic callWSToGetData({Map<String, String> params}) async {

    var client = http.Client();
    var url = baseUrl + allProducts;
    print("URL = $url");
    print("params: $params");
    print("header: $headers");
    var response = await client.post(url, headers: headers, body: params);

    var json = converter.jsonDecode(response.body);
    return json;
  }
}
类服务器管理器{
final baseUrl=isProduction?liveServer:StaginServer;
变量头={“使用者密钥”:“sdfgdqwrtw34563t545”};
动态callWSToGetData({Map params})异步{
var client=http.client();
var url=baseUrl+allProducts;
打印(“URL=$URL”);
打印(“参数:$params”);
打印(“页眉:$headers”);
var response=await client.post(url,headers:headers,body:params);
var json=converter.jsonDecode(response.body);
返回json;
}
}
调用api以获取如下数据

Map<String, String> params = {"categories_id": "1", "language_id": "1", "type": "Newest", "customers_id": "0", "page_number": "0"};
var response = ServerManager().callWSToGetData(params: params);
var res = ServerResponse<Product>.fromJson(response);
print(res.data);
Map参数={“categories\u id”:“1”,“language\u id”:“1”,“type”:“Newest”,“customers\u id”:“0”,“page\u number”:“0”};
var response=ServerManager().callWSToGetData(params:params);
var res=ServerResponse.fromJson(response);
打印(存储数据);
所以当我运行这段代码时,我得到了以下错误

类型“Future”不是类型“Map”的子类型。

问题是

  • 如何创建可用于处理服务器响应的单个泛型类
  • 请帮忙

    类型“Future”不是类型“Map”的子类型

    这可能是因为错过了等待电话。您的
    callWSToGetData
    在声明中具有异步,因此它的类型将是未来的

    要使用泛型,需要传递类型。因此,您的代码将如下所示:

    var response = await ServerManager().callWSToGetData(); //how can I use generic here
    var res = ServerResponse<Product>.fromJson(response);
    print(res.data);
    
    var response=wait ServerManager().callWSToGetData()//我如何在这里使用泛型
    var res=ServerResponse.fromJson(response);
    打印(存储数据);
    
    类型“Future”不是类型“Map”的子类型

    这可能是因为错过了等待电话。您的
    callWSToGetData
    在声明中具有异步,因此它的类型将是未来的

    要使用泛型,需要传递类型。因此,您的代码将如下所示:

    var response = await ServerManager().callWSToGetData(); //how can I use generic here
    var res = ServerResponse<Product>.fromJson(response);
    print(res.data);
    
    var response=wait ServerManager().callWSToGetData()//我如何在这里使用泛型
    var res=ServerResponse.fromJson(response);
    打印(存储数据);
    
    我在这里使用wait
    var response=wait client.post(url,headers:headers)
    我已经做了您建议的更改,得到这个
    类型“Future”不是类型“Map”的子类型
    如果您在函数声明中加入async,返回类型始终是Future,您需要等待它,与JavaScript中相同。您能看到这一错误出现在哪一行吗?我已经添加了调试点,当这一行出现时,控制台中会出现错误。
    var response=wait client.post(url,headers:headers,body:params)请更新您的问题,因为这是不同的代码。似乎
    params
    是另一个
    Future
    ,您需要
    wait
    它。我在这里使用wait
    var response=wait client.post(url,headers:headers)
    我已经做了您建议的更改,得到这个
    类型“Future”不是类型“Map”的子类型
    如果您在函数声明中加入async,返回类型始终是Future,您需要等待它,与JavaScript中相同。您能看到这一错误出现在哪一行吗?我已经添加了调试点,当这一行出现时,控制台中会出现错误。
    var response=wait client.post(url,headers:headers,body:params)请更新您的问题,因为这是不同的代码。似乎
    params
    是另一个
    Future
    ,您需要
    等待它。