Firestore 在 Flutter 中实现付费用户云同步和非付费用户离线缓存?

问题描述 投票:0回答:1

我正在 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();
  }

flutter firebase google-cloud-firestore database-design
1个回答
0
投票

您可以为未付费用户禁用 Firestore 客户端的网络访问

在 Firestore 发布后的最初几年,这曾经是一种反模式,因为 SDK 的性能会随着待写入的数量而线性恶化。但现在的 SDK 也在缓存中保留了最新版本的快照,并且可以在离线状态下执行索引查询,因此性能实际上相当不错。

© www.soinside.com 2019 - 2024. All rights reserved.