Stream / Bloc / Repository / Firebase数据流Flutter

问题描述 投票:0回答:1

我从flutter开始,因为我想将我的swift应用程序移植到Flutter,但是当我按照教程https://bloclibrary.dev/#/flutterfirestoretodostutorial面团使用实时数据库时,由于对模式Bloc / Repository / Firebase的了解而陷入困境,而不是Firestore。我的swift应用基本上是一张地图,您可以在其中添加实际位置的警报。警报将发送到Firebase,并且地图上的Firebase观察者将更新显示刚刚添加的警报的地图。上面的教程应该可以帮助我移植我的应用程序。我只是不确定我是否理解代码的逻辑。我的担心是2:

首先。在模型对象和firebase对象之间存在Entity层。据解释,这将有利于拥有不同的数据提供者,但我并不真正认为它可以促进任何事情。在Model类中,有toEntity()fromEntity()转换方法,在Entity类中,有fromSnapshot()toDocument()转换方法。我看不出这里有什么意义。真的有必要吗?直接在Model类中进行转换又有什么问题,每个数据提供者使用不同的方法?

第二。在TodoBloc中,我无法遵循逻辑。在AppStart发送到团体的第一个事件是LoadTodos

BlocProvider<TodosBloc>(
          create: (context) {
            return TodosBloc(
              todosRepository: FirebaseTodosRepository(),
            )..add(LoadTodos());

mapEventToState()TodoBloc方法中,事件已映射到此Stream:

Stream<TodosState> _mapLoadTodosToState() async* {
    _todosSubscription?.cancel();
    _todosSubscription = _todosRepository.todos().listen(
          (todos) => add(TodosUpdated(todos)),
        );
  }

到目前为止,一切都很好。据我了解,这订阅了todos() Stream()

@override
  Stream<List<Todo>> todos() {
    return todoCollection.snapshots().map((snapshot) {
      return snapshot.documents
          .map((doc) => Todo.fromEntity(TodoEntity.fromSnapshot(doc)))
          .toList();
    });
  }

并且这应该与我的Swift应用程序中的Firebase观察器等效。我不确定listen闭包中的这部分内容:(todos) => add(TodosUpdated(todos))

这将自身发送给(TodoBloc)一个TodosUpdated事件,该团体将在该事件上映射此Stream:

Stream<TodosState> _mapTodosUpdatedToState(TodosUpdated event) async* {
    yield TodosLoaded(event.todos);
  }

这是:

class TodosLoaded extends TodosState {
  final List<Todo> todos;

  const TodosLoaded([this.todos = const []]);

  @override
  List<Object> get props => [todos];

  @override
  String toString() => 'TodosLoaded { todos: $todos }';
}

这是Firebase对象的实际列表吗?每当在Firebase中添加新对象时,todos()流是否返回整个节点?在我的快速应用程序中,观察者在第一次下载节点后仅返回.childAdded。我是否应该使用具有firebase_database类(FirebaseList)的https://pub.dev/documentation/firebase_database/latest/ui_firebase_list/FirebaseList-class.html包,该包将像我的观察者在我的Swift应用程序中所做的那样仅返回节点上任何更改的列表?很抱歉这个冗长而混乱的问题,但是我在这里从集团模式开始就迷失了。非常感谢您的时间和帮助。

firebase flutter stream bloc
1个回答
0
投票

[好吧,我想我理解了背后的逻辑,但是如果您发现我做错了,请更正我,因为在进入新范式的这一阶段非常重要,不要怀有任何误解。

  1. todos()是来自Firebase的流,并返回List<Todo>
  2. _mapLoadTodosToState()是将bloc侦听器附加到todos()的bloc方法,在.listen(onData)回调中,它向bloc发送包含最新列表的TodosUpdated(todos)事件。
  3. TodosUpdated(todos)被映射到_mapTodosUpdatedToState,从而产生TodosLoaded(event.todos),BlocProvider用于构建UI的新状态。

谢谢,我希望这将有助于其他人在更复杂的水平上努力掌握BloC模式。干杯

© www.soinside.com 2019 - 2024. All rights reserved.