【发布时间】: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