[英]How to type cast for my use case in Dart 2
我正在尝试清理Flutter Architecture Samples github项目的一个分支上的一些(工作)代码。 在Dart 2中熟悉铸造的人是否对如何清理我的尝试有任何建议?
发布后这可能会更改,但是我目前拥有的是:
Stream<List<TodoEntity>> todos() {
return firebase.reference().child(path).onValue.map((event) {
if (event.snapshot == null || event.snapshot.value == null) return [];
return Map
.castFrom(event.snapshot.value.map((key, doc) {
return MapEntry(
key,
TodoEntity(
doc['task'],
key,
doc['note'] ?? '',
doc['complete'] ?? false,
));
}))
.values
.toList()
.cast();
});
}
我要进行多次转换,我希望可以删除.cast()
并更明确地说明类型,以便编译器知道该怎么做,并且更易于阅读和理解。
完整的代码目前可以在我的叉子上找到
顺便说一句: flutter_redux flutter应用程序可与firestore一起使用 ,我添加了支持使其能够与firebase实时数据库一起使用 ,包括测试。
编辑:感谢RémiRousselet ,以下作品无需铸造:
Stream<List<TodoEntity>> todos() {
return firebase.reference().child(path).onValue.map((event) {
if (event.snapshot == null || event.snapshot.value == null) return [];
final Map<dynamic, dynamic> value = event.snapshot.value;
final todoMap = value.map((key, doc) {
return MapEntry(
key,
TodoEntity(
doc['task'],
key,
doc['note'] ?? '',
doc['complete'] ?? false,
));
});
return todoMap.values.toList();
});
}
实际上,您不仅可以删除最后一个cast
,还可以进行更多类型检查。
final Map<String, dynamic> value;
final foo = value.map((key, doc) {
return MapEntry(
key,
TodoEntity(
doc['task'],
key,
doc['note'] ?? '',
doc['complete'] ?? false,
));
});
final values = foo.values.toList();
Dart将自动推断相应的类型。 因此foo
的类型为Map<String, TodoEntity>
, values
的类型为List<TodoEntity>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.