我正在呼叫请求服务器以获取数据并获得以下响应。
{
"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”类型的子类型
问题是...
请帮忙。
答案 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);