我今天跑了升级...
我现在在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 .
有没有人知道可能会发生什么?
2 回答
Uri.https的构造函数需要一个运行时类型为
Map<String, String>
的Map . 在没有任何类型注释的情况下创建stringParams
时,实际上是在创建Map<dynamic, dynamic>
. 为Dart 2创建这个的正确方法是之前工作的原因是,在Dart 1中,即使在强模式下,
dynamic
也是模糊的,并且像Object
和null
一样 - 意味着动态类型可以分配给任何东西 . 在Dart 2中,dynamic
就像Object
一样,除了你可以在没有向下转换的情况下调用方法或访问属性 .我用过这个