我今天跑了升级......
我现在在v0.2.11上,我在这个函数中遇到了一个奇怪的运行时错误:
Future apiCall([Map params = const {}]) async {
loading = true;
Map stringParams = {};
params.forEach((k,v)=>stringParams[k.toString()] = v.toString());
Uri url = new Uri.https(apiDomain, apiPath, stringParams);
print(url);
var result = await http.post(
url,
body: {'apikey': apiKey}
);
loading = false;
print(result.body);
return json.decode(result.body);
}
我在没有任何参数的情况下调用该函数,我得到了子类型错误。
此代码适用于dartpad。
有没有人知道可能会发生什么?
答案 0 :(得分:9)
Uri.https
的构造函数需要一个运行时类型为Map<String, String>
的Map。在没有任何类型注释的情况下创建stringParams
时,实际上是在创建Map<dynamic, dynamic>
。为Dart 2创建此项的正确方法是
Map<String, String> stringParams = {};
// or
var stringParams = <String, String>{};
之前工作的原因是,在Dart 1中,即使在强模式下,dynamic
也是模糊的,并且同时表现为Object
和null
- 这意味着动态类型可分配给从任何事情。在Dart 2中,dynamic
的行为与Object
类似,但您可以在没有向下转发的情况下调用方法或访问属性。
答案 1 :(得分:4)
我用了
if(json["key"]!= null){
this.active_guests = json["key"].cast<String, int>();
}
答案 2 :(得分:0)
您可以像这样发送嵌套的JSON参数:
使用json.encode
将其转换为字符串。
在标头中发送“ Content-Type:应用程序/ json”。
var uri = "${Config.baseURL}/your/endpoint";
var headers = {
'Content-Type': 'application/json'
};
final response = await http.post(
uri,
body: json.encode(data),
headers: headers
);