Vin*_*nzo 6 stream firebase flutter bloc
我从 flutter 开始,因为我想将我的 swift 应用程序移植到 Flutter,但是我在遵循教程https://bloclibrary.dev/#/flutterfirestoretodostutorial 时无法理解模式 Bloc/Repository/Firebase面团我使用实时数据库,而不是 Firestore。我的 swift 应用程序基本上是一张地图,您可以在其中在您的实际坐标处添加警报。警报被发送到 Firebase,地图上的 firebase 观察者会更新地图,显示刚刚添加的警报。上面的教程应该可以帮助我移植我的应用程序。我只是不确定我是否理解代码背后的逻辑。我的担忧是2:
第一的。Entity模型对象和 firebase 对象之间有一层。据解释,这将有助于拥有不同的数据提供者,但我并没有真正看到它促进任何事情。在Model类中有一个toEntity()和一个fromEntity()转换方法,在Entity类中有一个fromSnapshot()和一个toDocument()转换方法。我不明白这里有什么意义。真的有必要吗?直接在Model类中每个数据提供者都有不同的方法?
第二。在里面TodoBloc我不能遵循逻辑。发送到集团的第一个事件AppStart是LoadTodos。
BlocProvider<TodosBloc>(
create: (context) {
return TodosBloc(
todosRepository: FirebaseTodosRepository(),
)..add(LoadTodos());
Run Code Online (Sandbox Code Playgroud)
在mapEventToState()方法TodoBloc该事件被映射到该流:
Stream<TodosState> _mapLoadTodosToState() async* {
_todosSubscription?.cancel();
_todosSubscription = _todosRepository.todos().listen(
(todos) => add(TodosUpdated(todos)),
);
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。据我了解,这订阅了todos()Stream ()
@override
Stream<List<Todo>> todos() {
return todoCollection.snapshots().map((snapshot) {
return snapshot.documents
.map((doc) => Todo.fromEntity(TodoEntity.fromSnapshot(doc)))
.toList();
});
}
Run Code Online (Sandbox Code Playgroud)
这应该相当于我的 swift 应用程序中的 firebase 观察者。listen闭包内的这部分我不确定:(todos) => add(TodosUpdated(todos)).
这会向自身 (TodoBloc) 发送一个TodosUpdated事件,该集团将在该事件上映射此 Stream:
Stream<TodosState> _mapTodosUpdatedToState(TodosUpdated event) async* {
yield TodosLoaded(event.todos);
}
Run Code Online (Sandbox Code Playgroud)
这是这样的:
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 }';
}
Run Code Online (Sandbox Code Playgroud)
这是 Firebase 对象的实际列表吗?todos()每次在 Firebase 中添加新对象时,Stream是否都会返回整个节点?在我的 swift 应用程序中,观察者仅.childAdded在第一次下载节点后返回。我是否应该使用firebase_database具有FirebaseList类(https://pub.dev/documentation/firebase_database/latest/ui_firebase_list/FirebaseList-class.html)的包,该类将只返回节点上任何更改的列表,就像我的观察者在我的快速应用程序?很抱歉这个又长又乱的问题,但我在这里从集团模式开始迷路了。非常感谢您的时间和帮助。
好吧,我想我理解了它背后的逻辑,但是如果你发现我没有理解正确,请纠正我,因为在这个阶段进入新的范式非常重要,不要携带任何误解。
todos()是来自 Firebase 的 Stream 并返回一个List<Todo>._mapLoadTodosToState()是附加 bloc 侦听器的 bloc 方法,todos()在回调中.listen(onData),它向 bloc 发送TodosUpdated(todos)包含最新列表的事件。TodosUpdated(todos)被映射到_mapTodosUpdatedToState,这会产生
TodosLoaded(event.todos),BlocProvider 用于构建 UI 的新状态。谢谢,我希望这能帮助其他人在更复杂的层面上努力掌握 BloC 模式。干杯
| 归档时间: |
|
| 查看次数: |
1885 次 |
| 最近记录: |