我有这种方法,可以在Dart 2中进行编译,但是在运行时出现以下错误
类型“
List<dynamic>”不是类型的子类型“List<ExchangeRate>”
如您在代码中所见,我在其中创建并返回了新的ExchangeRate对象.map(),然后返回了rateEntries.toList()我希望是type的a 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());
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我专门将其强制转换为ExchangeRate,那会很好。
return rateEntries.toList().cast<ExchangeRate>();
Run Code Online (Sandbox Code Playgroud)
最后的转换对我来说似乎是多余的,为什么我需要它?
好吧,似乎必须使用强制类型转换来完全定义类型。
但是,如果添加以下任何代码段,则可以避免强制转换:
为rateJsonEntries变量提供正确的类型
List<dynamic> rateJsonEntries = jsonEntries["rates"].entries.toList();
无论出于何种原因,这对我来说都是行得通的。
将参数类型添加到map()方法中
var rateEntries = rateJsonEntries.map<ExchangeRate>((x) {
return new ExchangeRate(x.value.toDouble());
});
| 归档时间: |
|
| 查看次数: |
1155 次 |
| 最近记录: |