打破异常&#39; _InternalLinkedHashMap <dynamic,dynamic =“”>&#39;不是类型的子类型&#39; Map <string,string =“”>&#39;

时间:2018-04-13 19:49:20

标签: 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);
}

我在没有任何参数的情况下调用该函数,我得到了子类型错误。

此代码适用于dartpad。

有没有人知道可能会发生什么?

3 个答案:

答案 0 :(得分:9)

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类似,但您可以在没有向下转发的情况下调用方法或访问属性。

答案 1 :(得分:4)

我用了

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

答案 2 :(得分:0)

您可以像这样发送嵌套的JSON参数:

  1. 使用json.encode将其转换为字符串。

  2. 在标头中发送“ Content-Type:应用程序/ json”。

var uri = "${Config.baseURL}/your/endpoint";
var headers = {
  'Content-Type': 'application/json'
};
final response = await http.post(
  uri,
  body: json.encode(data),
  headers: headers
);