1

我正在尝试清理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()并更明确地了解类型,以便编译器知道要做什么并且更容易阅读和理解。

目前可以在我的fork上找到完整的代码

顺便说一句:flutter_redux颤振应用程序与firestore一起使用,我添加了支持以使其能够与firebase 实时数据库一起使用,包括测试。

编辑:感谢Rémi Rousselet,以下作品无需铸造:

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();
  });
}
4

1 回答 1

2

实际上,您不仅可以删除最后一个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>

于 2018-05-12T16:48:35.957 回答