【发布时间】:2020-06-07 09:29:30
【问题描述】:
我从 Flutter 开始,因为我想将我的 swift 应用程序移植到 Flutter,但是我在学习 Bloc/Repository/Firebase 模式时遇到了困难,因为我正在学习https://bloclibrary.dev/#/flutterfirestoretodostutorialdough 我实时使用的教程数据库,而不是 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());
在TodoBloc 的mapEventToState() 方法中,该事件被映射到此流:
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 事件,该 bloc 将在该事件上映射此 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() Stream 是否会返回整个节点?
在我的 swift 应用程序中,观察者在第一次下载节点后仅返回 .childAdded。
我是否应该使用具有FirebaseList 类(https://pub.dev/documentation/firebase_database/latest/ui_firebase_list/FirebaseList-class.html) 的firebase_database 包,它只会在节点上的任何更改上返回一个列表,就像我的观察者在我的swift 应用程序中所做的那样?
很抱歉这个冗长而混乱的问题,但我从 bloc 模式开始就迷失了。
非常感谢您的时间和帮助。
【问题讨论】:
标签: firebase flutter stream bloc