dart - 为什么 toList() 在 Dart 中创建一个 List<dynamic> ?

标签 dart

我有这个方法,它在 Dart 2 中编译没有问题。但是在运行时我收到以下错误

type 'List<dynamic>' is not a subtype of type 'List<ExchangeRate>'



正如您在代码中看到的,我在 .map() 内创建并返回了新的 ExchangeRate 对象。然后我返回一个 rateEntries.toList()我希望它的类型是 List<ExchangeRate> ,但它似乎被推断为类型 List<dynamic> !!!
@override
Future<List<ExchangeRate>> getExchangeRatesAt(DateTime time, Currency baseCurrency) async {
  final http.Client client = http.Client();
  final String uri = "some uri ...";
  return await client
    .get(uri)
    .then((response) {
      var jsonEntries = json.decode(response.body) as Map<String, dynamic>;
      var rateJsonEntries = jsonEntries["rates"].entries.toList();
      var rateEntries = rateJsonEntries.map((x) {
        return new ExchangeRate(x.value.toDouble());
      });
      return rateEntries.toList(); // WHY IS IT RETURNING A List<dynamic> here?
    })
    .catchError((e) => print(e))
    .whenComplete(() => client.close());
}

但是,如果我专门将它转换为 ExchangeRate,那就没问题了。
    return rateEntries.toList().cast<ExchangeRate>();

最后这个类型转换对我来说似乎是多余的,我为什么需要它?

最佳答案

好吧,似乎强制转换对于完全定义类型是必要的。

但是,如果添加以下任何片段,则可以避免强制转换:

  • rateJsonEntries 提供正确的类型多变的
    List<dynamic> rateJsonEntries = jsonEntries["rates"].entries.toList();
    无论出于何种原因,这都适用于我的情况。
  • 将参数类型添加到 map()方法
    var rateEntries = rateJsonEntries.map<ExchangeRate>((x) { return new ExchangeRate(x.value.toDouble()); });
  • 关于dart - 为什么 toList() 在 Dart 中创建一个 List<dynamic> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53926305/

    相关文章:

    dart - 将onTap监听器添加到appBar(Flutter)

    android - 如何在 Flutter 中使用本地资源播放音频?

    android-studio - Flutter : What are the differences between Flutter Plugin, Flutter 包和 Flutter 模块?

    Flutter expansionTile 标题填充

    flutter - ref0 未被 petitparser 解析

    flutter - 如何在 Dart/Flutter 中重试 Future?

    dart - 如何让 dartdoc 包含其他文档?

    flutter - 滑动动画结束后如何只渲染pageView页面

    firebase - 从Firestore子集合到dart/flutter对象检索快照

    firebase - Flutter/Firebase-如何创建包含水平 ListView 的垂直 ListView