我有这个方法,它在 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/