You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter每周预约刷新问题:如何检测已过周一且未执行刷新?

解决每周一刷新错过执行的问题

核心问题是你的代码没有持久化记录上次执行刷新的时间,导致APP重启后无法判断是否已经错过了本周一的刷新节点,只能直接计算下周一的时间,从而跳过本次刷新。

修复步骤

1. 持久化存储上次刷新时间

用本地存储(比如SharedPreferences)记录最后一次执行刷新的时间,这样APP重启后能读取到历史记录。

import 'package:shared_preferences/shared_preferences.dart';

// 获取上次刷新时间
Future<DateTime?> _getLastRefreshTime() async {
  final prefs = await SharedPreferences.getInstance();
  final timestamp = prefs.getInt('last_weekly_refresh');
  return timestamp != null ? DateTime.fromMillisecondsSinceEpoch(timestamp) : null;
}

// 更新上次刷新时间
Future<void> _updateLastRefreshTime() async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.setInt('last_weekly_refresh', DateTime.now().millisecondsSinceEpoch);
}

2. 修改刷新启动逻辑

打开APP时先检查是否错过本周一的刷新节点,若错过则立即执行刷新,再启动下一次定时器。

void startWeeklyRefresh() async {
  final lastRefresh = await _getLastRefreshTime();
  final now = DateTime.now().toUtc().add(const Duration(hours: 3)); // 适配土耳其UTC+3时区
  // 计算本周一零点的时间
  final thisMonday = DateTime(now.year, now.month, now.day)
      .subtract(Duration(days: now.weekday - DateTime.monday))
      .copyWith(hour: 0, minute: 0, second: 0);

  // 判断是否需要立即执行刷新:从未刷新过,或上次刷新在本周一之前
  if (lastRefresh == null || lastRefresh.isBefore(thisMonday)) {
    await _performWeeklyReset();
    await _updateLastRefreshTime();
  }

  // 计算到下周一零点的时间,启动定时器
  final remainingTime = _calculateTimeUntilNextMonday();
  Timer(remainingTime, () async {
    await _performWeeklyReset();
    await _updateLastRefreshTime();
  });
}

3. 简化剩余时间计算逻辑

去掉原代码中导致跳过本周的判断,因为现在已经靠历史记录处理错过的情况:

Duration _calculateTimeUntilNextMonday() {
  DateTime now = DateTime.now().toUtc().add(const Duration(hours: 3));
  int targetDay = DateTime.monday;
  int daysUntilMonday = (targetDay - now.weekday + 7) % 7;
  
  // 如果今天就是周一,直接计算7天后的下周一零点
  if (daysUntilMonday == 0) {
    daysUntilMonday = 7;
  }

  DateTime nextTargetDay = now.add(Duration(days: daysUntilMonday)).copyWith(
    hour: 0,
    minute: 0,
    second: 0
  );
  return nextTargetDay.difference(now);
}

逻辑说明

  • 每次APP启动时,先对比上次刷新时间和本周一零点:如果上次刷新更早,说明已经错过本周的刷新任务,立即执行并更新记录。
  • 无论是否立即执行,都会启动下周一的定时器,确保后续自动刷新正常运行。
  • 持久化存储保证了APP关闭重启后不会丢失历史刷新记录,彻底解决“周一未打开APP就跳过刷新”的问题。

内容的提问来源于stack exchange,提问作者Korhan_34

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:13:18