我正在 Flutter 中构建一个使用 Firestore 作为后端数据库的应用程序。我想只对付费用户实现在线同步,而非付费用户只能使用本地数据库缓存。我已经建立了一个系统,可以禁用未订阅用户的网络访问,并在他们订阅时启用网络访问。
但是根据我的理解,这并不是它的用途。当未付费用户订阅时,其所有累积的离线交易将单独同步到 Firestore,这可能会导致大量交易。
我的 Firestore 数据库的结构为“用户 ID”>“列表”>“项目”。如何处理只有付费用户才有云同步功能的场景?我确信我可以为无付费用户使用 SQLite 并尝试以某种方式同步,但我希望只使用 Firestore 来保持简单。处理这种情况的推荐方法是什么?
我在下面提供了我当前的实现以供参考:
ListProvider(this.subscriptionProvider) {
_listsRef = _firestore.collection('lists'); // Initialize here in the constructor body
_initializeDataFlow();
}
Future<void> _initializeDataFlow() async {
subscriptionProvider.addListener(_handleSubscriptionChange);
await _handleSubscriptionChange();
}
Future<void> _handleSubscriptionChange() async {
if (subscriptionProvider.hasActiveSubscription) {
await _firestore.enableNetwork();
print("Network enabled: Syncing with Firestore.");
} else {
await _firestore.disableNetwork();
print("Network disabled: Using local cache only.");
}
_listenToLists();
}
void _listenToLists() {
_isLoading = true;
notifyListeners();
_listsRef.orderBy('orderField').snapshots().listen((snapshot) {
_lists = snapshot.docs.map((doc) => ListModel.fromMap(doc.data() as Map<String, dynamic>)).toList();
_isLoading = false;
notifyListeners();
});
}
@override
void dispose() {
subscriptionProvider.removeListener(_handleSubscriptionChange);
super.dispose();
}
您可以为未付费用户禁用 Firestore 客户端的网络访问。
在 Firestore 发布后的最初几年,这曾经是一种反模式,因为 SDK 的性能会随着待写入的数量而线性恶化。但现在的 SDK 也在缓存中保留了最新版本的快照,并且可以在离线状态下执行索引查询,因此性能实际上相当不错。