flutter - 中断异常 '_InternalLinkedHashMap<dynamic, dynamic>' 不是类型 'Map<String, String>' 的子类型

标签 flutter http dictionary 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。

有人知道会发生什么吗?

最佳答案

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 , 除非您可以调用方法或访问其上的属性而无需向下转换。

关于flutter - 中断异常 '_InternalLinkedHashMap<dynamic, dynamic>' 不是类型 'Map<String, String>' 的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49824167/

相关文章:

Flutter 文档非常困惑,SliverOverlapAbsorber 和 SliverOverlapInjector 有什么用?

ruby-on-rails - 为什么 Puma 监听 'tcp://localhost:3000' 而不是 'http://localhost:3000'

r - 在 R 中不使用梯度制作 Choropleth

C++, map 插入&&文件流读取导致麻烦

json - 将 Firebase 实时数据库 json 响应从 _InternalLinkedHashMap<Object?, Object?> 转换为 Map<String,dynamic>

flutter - 找不到带有以下内容的广告。原生广告 Flutter google_mobile_ads

http - 压缩 1200-1500 个字符的 URL 的有效方法是什么?

python - 字典中的最高值

flutter - Dart 中的多级 map 或 map 列表?

xcode - 您可以使用 HLS 从 HTTPS 服务器流式传输吗?