我今天进行了 flutter 升级...
我现在使用的是 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<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
, 除非您可以调用方法或访问其上的属性而无需向下转换。
关于flutter - 中断异常 '_InternalLinkedHashMap<dynamic, dynamic>' 不是类型 'Map<String, String>' 的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49824167/