【问题标题】:How to listen for values of a StreamProvider in another Provider and not get duplicates如何在另一个 Provider 中侦听 StreamProvider 的值而不是重复
【发布时间】:2021-06-27 18:52:53
【问题描述】:

我想使用 Riverpod 中的 StreamProvider 实时收听 firebase 集合,并将值读入另一个 Provider,但我没有尝试过任何工作。

/// StreamProvider
final firstProvider = StreamProvider.autoDispose((ref) async* {
  final stream = FirebaseFirestore.instance
      .collection('someCollection')
      .orderBy('timestamp', descending: true)
      .snapshots()
      .distinct();

  await for (final value in stream) {
    print('value: $value');
    yield value;
  }
}

final secondProvider = FutureProvider.autoDispose((ref) async {
  final first_provider = await ref.watch(firstProvider);
  print(first_provider .whenData((value) => value.docChanges.length));
  ...
});

我认为通过使用 docChanges 我只会获得新数据,但相反,它会在每次重建时重复。

关于我做错了什么有什么想法吗?

【问题讨论】:

    标签: flutter stream riverpod


    【解决方案1】:

    您的供应商很好。但是,docChanges 返回自上次快照以来更改的文档数组,如果是第一个快照,则将包含所有文档。

    您在提供程序上使用autoDispose 修饰符。因此,如果您正在从中读取提供程序的小部件(或其他提供程序等)被释放,您的提供程序也将被释放。这将导致从您的数据库中重新读取,从而导致docChanges 返回所有文档。

    尝试删除 autoDispose 修饰符,看看会发生什么。

    【讨论】:

    • 您好,感谢您的回答!是的,我实际上已经这样做并解决了问题,尽管我认为这不是正确的方法。使用 .autodispose 修饰符我们有一个新属性 ref.mantainstate,默认为 false。根据文档riverpod.dev/docs/concepts/modifiers/auto_dispose,通过将此设置为 true,如果更改屏幕/重建小部件,我们将不会触发任何其他请求。
    • 很高兴你能解决它。我会说这种方法取决于用例。如果 maintainState 在这里为您工作,那么我会说很好,如果可以的话,通常最好使用 autoDispose。不过肯定有不使用它的时候。
    【解决方案2】:

    如果有人遇到同样的问题,我通过设置 autoDispose 修饰符提供的额外属性 maintainState 来解决它。

    final firstProvider = StreamProvider.autoDispose((ref) async* {
      final stream = FirebaseFirestore.instance
          .collection('someCollection')
          .orderBy('timestamp', descending: true)
          .snapshots()
          .distinct();
      
      ref.mantainstate = true;
    
      await for (final value in stream) {
        print('value: $value');
        yield value;
      }
    }
    

    【讨论】:

    • 既然这解决了您的问题,您应该将此标记为已接受的答案。
    猜你喜欢
    • 2020-12-06
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多