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