dart - 为什么 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>();
最后的这种铸造对我来说似乎是多余的,我为什么需要它?
解决方案
好吧,似乎需要强制转换才能完全定义类型。
但是,如果您添加以下任何片段,则可以避免强制转换:
给
rateJsonEntries
变量正确的类型List<dynamic> rateJsonEntries = jsonEntries["rates"].entries.toList();
无论出于何种原因,这对我来说都是有效的。
将参数类型添加到
map()
方法中var rateEntries = rateJsonEntries.map<ExchangeRate>((x) { return new ExchangeRate(x.value.toDouble()); });
推荐阅读
- sql-server - 如何使用 PowerShell 脚本还原 Azure SQL Server 数据库上的架构?
- reactjs - 如何将折叠/展开图标更改为材质树视图的右侧?
- java - Springboot + Hibernate with ElasticSearch:没有结果
- node.js - 使用 mongoosastic 在全文搜索中进行模糊搜索
- json - 单引号字符串中的 Powershell 变量扩展
- java - NullPointerException 没有行号的错误。如何在 Android Studio 中获取导致此错误的行号?
- microsoft-cognitive - 运行认知服务读取文本容器预览时出错
- visual-studio - Deploy/debug app from VS 2019 to windows 10 mobile phone via USB
- python - 带有 Sphinx Python 文档生成器错误的 Graphviz 图
- python - Flask Route REcorator 中有两个或多个变量?