Flutter -如何在日期变化时刷新来自Riverpod FutureProvider的数据列表?

x6h2sr28  于 2023-10-22  发布在  Flutter
关注(0)|答案(2)|浏览(165)

我有一个Flutter应用程序,它显示了与当前日期相关的数据元素列表,这些数据元素来自RiverPod FutureProvider。
该应用程序可以在移动的手机上打开一整夜,我正在努力研究如何让列表在第二天早上拿起移动的手机时自动刷新,以便它显示新的一天的数据元素。
我尝试使用以下StreamProvider作为刷新

final newDayProvider= StreamProvider<DateTime?>((ref)  async* {

  const String aPropName = 'dayCheckerTimestamp';

  await for (final  aDate in Stream<DateTime?>.periodic(const Duration(minutes: 1), (_) {
    var aDayHasChanged = false;
    final aStr = ref.read(sharedPrefsProvider).getString(aPropName);
    final aNow = DateTime.now();
    if (aStr != null) {
      DateTime aPrev = DateTime.parse(aStr);
      aDayHasChanged = (aNow.day != aPrev.day) || (aNow.month != aPrev.month) || (aNow.year != aPrev.year);
    }
    ref.read(sharedPrefsProvider).setString(aPropName,aNow.toIso8601String());
    if (aDayHasChanged) {
      return aNow;
    }
    return null;
  })
  ) {
    if (aDate != null) {
      yield aDate;
    }
  };

});

然后将下面这行代码注入到相关的FutureProvider中

final findTodayDashboardTaskProvider = FutureProvider.autoDispose<List<GdTask>>( (ref) async {
  final aNewDate = ref.watch(newDayProvider);

.想法是新的日流事件将触发FutureProvider的刷新。
但是,这是行不通的。当我第二天早上拿起移动的手机时,应用程序仍然显示与昨天相关的数据元素,而不是当天。
我猜,由于手机是离开过夜所有的应用程序进入休眠状态,和流供应商的代码从来没有运行。是这样吗?
有什么建议可以解决这个问题吗?

hiz5n14c

hiz5n14c1#

也许是这样的:

final midnightProvider = Provider<DateTime>((ref) {
  final now = DateTime.now();
  final tomorrow =
      now.copyWith(hour: 24, minute: 0, second: 0); // midnight tomorrow
  final gap = tomorrow.difference(now);
  // print(gap);
  Timer(gap, ref.invalidateSelf);
  return tomorrow;
});

这应该在每天午夜重置,并返回下一次醒来的时间。

mxg2im7a

mxg2im7a2#

将您的FutureProveder更改为StreamProvider。
我的理解是,一旦FutureProvider提供了一个结果,它就不会再运行,并将停止监听它的提供者。(当然,如果使用FutureProvider的小部件被重新构建,并且根据它的编码方式,它可能会创建一个新的FutureProvider并使用其结果。

相关问题