首页 > 解决方案 > Riverpod 提供程序调用一次 - 为什么对提供程序的后续调用会“缓存”?

问题描述

我正在使用 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 的理解以及它是如何工作的存在脱节,希望有人能解释我的误解。

谢谢!

标签: flutterflutter-providerriverpod

解决方案


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

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

  context.refresh(pendingUploadsCounterProvider);

推荐阅读