首页 > 解决方案 > 为什么 toList() 创建一个列表在飞镖?

问题描述

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

类型“ List<dynamic>”不是类型“ ”的子List<ExchangeRate>类型

正如您在代码中看到的那样,我在其中创建并返回了新的 ExchangeRate 对象.map(),然后我返回了一个rateEntries.toList()我希望是 type 的对象List<ExchangeRate>,但是它似乎被推断为 type 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>();

最后的这种铸造对我来说似乎是多余的,我为什么需要它?

标签: dart

解决方案


好吧,似乎需要强制转换才能完全定义类型。

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

  1. rateJsonEntries变量正确的类型

    List<dynamic> rateJsonEntries = jsonEntries["rates"].entries.toList();

    无论出于何种原因,这对我来说都是有效的。

  2. 将参数类型添加到map()方法中

    var rateEntries = rateJsonEntries.map<ExchangeRate>((x) { return new ExchangeRate(x.value.toDouble()); });


推荐阅读