我有一个Firestore文档,它很少更改,在我的应用程序中的许多不同地方都用作查找表。我的理解是,当我获取文档时,它总是在执行服务器查询,即使文档中的数据没有更改。本地缓存仅在服务器不可用时使用。
由于文档很少更改,我想做这样的事情。。。
1( 当应用程序启动时,获取文档并将其存储在本地。
2( 设置侦听器,以便在文档发生更改时更新本地副本。
3( 当本地副本更新时,将此更改广播到可能正在使用文档的任何小部件。
这是我希望Firestore默认工作的方式。
这是个好主意吗?关于如何实施,有什么建议吗?
以下是我最终所做的。它实际上是相当直接的。我把它实现为一个静态类,不确定这是否是最好的方法。但我喜欢其他一切。
我创建了一个类,它为文档设置了一个监听器,并在文档更新时提供了一个流。作为一项辅助工作,我的类还将文档解析为Map并对游戏进行排序。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'dart:async';
import 'package:pari/game.dart';
class Schedule {
static Map<String, Game> games = Map<String, Game>();
static StreamController<Map<String, Game>> _onUpdateController = StreamController.broadcast();
static Stream get onUpdate => _onUpdateController.stream;
static void setupListener() {
print('setupListener');
DocumentReference reference = Firestore.instance.collection('schedule').document('2018');
reference.snapshots().listen((documentSnapshot) {
print('listen begin');
List<Game> sortedList = List<Game>();
documentSnapshot.data.values.forEach((value) {
Game game = Game.fromMap(value);
sortedList.add(game);
});
sortedList.sort((a,b) => a.startTime.compareTo(b.startTime));
games.clear();
sortedList.forEach((game) {
games.addAll({game.key: game});
});
_onUpdateController.add(games);
print('listen end');
print('games: ${games.length}');
});
}
}