flutter - 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 的理解以及它是如何工作的存在脱节,希望有人能解释我的误解。
谢谢!
解决方案
提供程序不会被释放,而树中的小部件您需要将其从要释放的后堆栈中删除
在您的情况下,您需要通过调用在其他屏幕上重新加载它
context.refresh(pendingUploadsCounterProvider);
推荐阅读
- python - 在 python 中处理 Slack 按钮操作 POST 请求数据
- xcode - 无法运行从 github 下载的应用程序
- typo3 - TYPO3 sys_language_mode = strict 仍然让我获得“默认”语言的记录
- node.js - npx 每次都需要重新安装包
- php - 如何删除IN条件cakephp中的单引号
- java - 使用图像图标在 Jlabel 中显示图像
- java - JDBC 连接(java 到 oracle)连接问题
- sql - sql 选择最早日期多行
- php - 如何在php中将doc、docx文件转换为纯文本?
- sql - AWS athena hive 从 csv 文件中删除页脚