为什么在Dart中toList()会创建一个List

10 浏览
0 Comments

为什么在Dart中toList()会创建一个List

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

类型 \'List\' 不是类型 \'List\' 的子类型

如您在代码中所见,我在.map()内创建和返回新的ExchangeRate对象,然后在此之后返回rateEntries.toList(),我希望它是类型List,但它似乎被推断为类型List!!!

@override
Future<List> 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 here?
    })
    .catchError((e) => print(e))
    .whenComplete(() => client.close());
}

但是,如果我将其明确地强制转换为ExchangeRate,它将是正确的。

    return rateEntries.toList().cast();

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

admin 更改状态以发布 2023年5月22日
0
0 Comments

好像必须使用cast来完全定义类型。

但是,如果添加以下代码片段,则可以避免使用cast:

  1. 将正确的类型赋予rateJsonEntries变量

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

    出于某种原因,这在我的案例中起作用。

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

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

0