首页 文章

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

提问于
浏览
2

我今天跑了升级...

我现在在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 回答

  • 0

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

    Map<String, String> stringParams = {};
    // or
    var stringParams = <String, String>{};
    

    之前工作的原因是,在Dart 1中,即使在强模式下, dynamic 也是模糊的,并且像 Objectnull 一样 - 意味着动态类型可以分配给任何东西 . 在Dart 2中, dynamic 就像 Object 一样,除了你可以在没有向下转换的情况下调用方法或访问属性 .

  • 3

    我用过这个

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

相关问题