破坏异常'_InternalLinkedHashMap <dynamic,dynamic>'不是'Map <String,String>'类型的子类型

Jef*_*els 12 dart 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);
}
Run Code Online (Sandbox Code Playgroud)

我正在调用没有任何参数的函数,我得到了子类型错误.

此代码适用于dartpad.

有谁知道可能会发生什么?

Jon*_*ams 13

构造函数Uri.https需要具有运行时类型的Map Map<String, String>.在stringParams没有任何类型注释的情况下创建时,实际上是在创建一个Map<dynamic, dynamic>.为Dart 2创建这个的正确方法是

Map<String, String> stringParams = {};
// or
var stringParams = <String, String>{};
Run Code Online (Sandbox Code Playgroud)

这个曾经工作过的原因是,在省道1,即使在强烈的模式,dynamic是模糊的,举止都Objectnull-这意味着一个动态类型是分配,并从任何东西.在Dart 2中,dynamic行为就像Object,除了你可以在没有向下转换的情况下调用方法或访问属性.


Moh*_*med 7

我用这个

    if(json["key"]!= null){
       this.active_guests = json["key"].cast<String, int>();
     }
Run Code Online (Sandbox Code Playgroud)