【问题标题】:breaking exception '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, String>'破坏异常 '_InternalLinkedHashMap<dynamic, dynamic>' 不是类型 'Map<String, String>' 的子类型
【发布时间】:2018-09-24 05:41:00
【问题描述】:

我今天进行了颤振升级...

我现在使用的是 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。

有人知道会发生什么吗?

【问题讨论】:

  • 这本身并不是一个答案,但this page 可能有助于您了解 Dart 2.0 中的新类型安全功能。

标签: flutter http dictionary dart


【解决方案1】:

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

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

  2. 在标头中发送“Content-Type:application/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
);

【讨论】:

    【解决方案2】:

    我用过这个

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

    【讨论】:

    • 嵌套地图怎么样:'(
    【解决方案3】:

    Uri.https 的构造函数需要一个运行时类型为 Map&lt;String, String&gt; 的 Map。当您创建没有任何类型注释的stringParams 时,您实际上是在创建一个Map&lt;dynamic, dynamic&gt;。为 Dart 2 创建它的正确方法是

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

    这曾经起作用的原因是,在 Dart 1 中,即使在强模式下,dynamic 也是模糊的,并且表现得像 Objectnull - 这意味着动态类型可以分配给任何东西。在 Dart 2 中,dynamic 的行为与 Object 类似,不同之处在于您可以在其上调用方法或访问属性而无需向下转换。

    【讨论】:

    • 如果我的对象是 Map 类型会发生什么。在这种情况下如何提出发布请求?它不断给出上述错误。
    猜你喜欢
    • 2018-12-14
    • 2019-04-03
    • 2019-05-02
    • 2020-08-20
    • 2023-04-02
    • 2021-07-11
    • 1970-01-01
    • 2019-08-07
    • 2021-01-17
    相关资源
    最近更新 更多