【发布时间】:2021-03-19 15:29:21
【问题描述】:
我目前正在设置我的第一个 Firebase 商店,并想知道如何最好地避免不必要的读/写成本(以及如何创建嵌套结构......)。 this answer 很有帮助。
但是,如果我听到文档的更改(由其他人引起),我假设我自己也会再次得到任何更改作为回报。因此,当使用 bloc 的 todo 示例的逻辑时,我更新了一个文档。我的侦听器识别出这一点并触发一个事件以从存储库中重新读取数据。
@override
Stream<TodosState> mapEventToState(TodosEvent event) async* {
if (event is LoadTodos) {
yield* _mapLoadTodosToState();
} else if (event is TodosUpdated) {
yield* _mapTodosUpdateToState(event);
} else if (event is UpdateTodo) {
yield* _mapUpdateTodoToState(event);
}
Stream<TodosState> _mapLoadTodosToState() async* {
_todosSubscription?.cancel();
_todosSubscription = _todosRepository.todos().listen(
(todos) => add(TodosUpdated(todos)),
);
}
Stream<TodosState> _mapTodosUpdateToState(TodosUpdated event) async* {
yield TodosLoaded(event.todos);
}
Stream<TodosState> _mapUpdateTodoToState(UpdateTodo event) async* {
_todosRepository.updateTodo(event.updatedTodo);
}
由于我假设我的应用程序中的同一用户可能对文档进行多次近期更改,因此将源选项设置为离线缓存 1 分钟,每次写入访问是一个正确的选项还是有更好的选项?
如果没有,我能否以某种方式确保在用户离开应用程序时发送数据(例如,当预先启动另一个应用程序时)?
有没有关于如何使用 Firestone 和 Flutter 的概述?不幸的是,Google's documentation 中的编码示例适用于除 Dart/Flutter 之外的任何语言。例如,我将如何使用 Flutter 设置源选项(尚未搜索)?
【问题讨论】:
-
您不应该以这种方式优化读取。这不值得 - 如果您担心这个,我假设您正在从事一个业余项目,但是,即使您正在将数据写入这些位置,您仍然应该在需要它们的地方使用实时侦听器。
-
是的,它目前是一种爱好 POC,但可能会变成一个小型商业应用程序。但当然我可以按照你的建议开始,如果它应该改变这种逻辑,那么。
标签: firebase flutter google-cloud-firestore