通用的通用类来处理服务器响应波动

时间:2019-12-06 10:59:55

标签: http flutter dart

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

{
  "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"];    
  } 
}

因此从服务器来说,格式将适用于每次通话,如下所示...

{
   "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"];
  }
}

这就是我调用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;
  }
}

调用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);

因此,当我运行这段代码时,我得到以下错误。

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

问题是...

  1. 如何创建一个可用于处理服务器响应的通用类?

请帮忙。

1 个答案:

答案 0 :(得分:0)

  

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

这可能是由于缺少等待呼叫。您的callWSToGetData在声明中具有异步功能,因此其类型将为Future。

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

var response = await ServerManager().callWSToGetData(); //how can I use generic here
var res = ServerResponse<Product>.fromJson(response);
print(res.data);