【问题标题】:riverpod provider called once - why are subsequent calls to the provider "cached?"Riverpod 提供程序调用一次 - 为什么对提供程序的后续调用会“缓存”?
【发布时间】:2021-10-27 10:07:52
【问题描述】:

我正在使用 Riverpod,并且我有一个相对简单的提供程序,用于从 Firestore 获取待处理写入的数量。这主要用于帮助用户反馈他们的数据是否完全同步。

final pendingUploadsCounterProvider =
    FutureProvider.autoDispose.family<int, List<Report>>((ref, reports) async {
  final db = ref.read(firebaseServiceProvider).db;
  final reportIds = reports.map((e) => e.id).toList();

  final documents = await Future.wait([
    for (final name in kReportTypes)
      db
          .collection(name)
          .where('report_id', whereIn: reportIds)
          .get(GetOptions(source: Source.cache))
  ]);

  return documents.where((event) => event.metadata.hasPendingWrites).length;
});

如您所见,我所做的只是从 Firestore 缓存中读取一些数据,然后根据 hasPendingWrites 属性过滤该列表。

我正在尝试在多个屏幕上使用此提供程序,因为我需要向用户提供有关其在多个位置的同步状态的反馈。

当我仅在单个屏幕上使用此提供程序时,每次我进入屏幕时,都会触发该提供程序并获得最新状态。

当我在多个屏幕上使用此提供程序时,当我第一次进入使用它的屏幕时,会触发该提供程序。随后,进入使用此提供程序的任何其他屏幕,不再触发提供程序,因此结果已过期。

我以为通过使用autoDispose,当我离开屏幕时,提供程序会被处理掉,但事实并非如此。

我确信我对 Riverpod 的理解和它的工作原理存在脱节,希望有人能解释我的误解。

谢谢!

【问题讨论】:

    标签: flutter flutter-provider riverpod


    【解决方案1】:

    提供程序不会被释放,而树中的小部件需要从要释放的后堆栈中删除它

    在您的情况下,您需要在其他屏幕上重新加载它 通过调用

      context.refresh(pendingUploadsCounterProvider);
    

    【讨论】:

    • 谢谢,奥马尔!有没有更优雅的方式来处理我想要完成的事情?
    • 我觉得你可以用它作为 StreamProvider 来保持数据最新
    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多