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