我从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应用程序中所做的那样仅返回节点上任何更改的列表?很抱歉这个冗长而混乱的问题,但是我在这里从集团模式开始就迷失了。非常感谢您的时间和帮助。
[好吧,我想我理解了背后的逻辑,但是如果您发现我做错了,请更正我,因为在进入新范式的这一阶段非常重要,不要怀有任何误解。
todos()
是来自Firebase的流,并返回List<Todo>
。 _mapLoadTodosToState()
是将bloc侦听器附加到todos()
的bloc方法,在.listen(onData)
回调中,它向bloc发送包含最新列表的TodosUpdated(todos)
事件。 TodosUpdated(todos)
被映射到_mapTodosUpdatedToState
,从而产生TodosLoaded(event.todos)
,BlocProvider用于构建UI的新状态。谢谢,我希望这将有助于其他人在更复杂的水平上努力掌握BloC模式。干杯