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

Flutter local notifications如何从指定日期开始设置每日定时通知

Flutter本地通知从指定日期开始每日重复推送解决方案

核心问题说明

原有代码仅能触发一次的核心原因有两个:

  1. 调用zonedSchedule时没有配置重复触发规则,插件默认仅执行一次通知调度
  2. 时间计算逻辑没有兼容「当前时间早于起始日期」「当前时间晚于起始日期」两种场景

1. 通知创建代码修改

给zonedSchedule方法添加matchDateTimeComponents参数,指定按每日同一时间重复触发:

await _flutterLocalNotificationsPlugin?.zonedSchedule(
  id,
  title,
  load,
  // 传入你自定义的起始日期参数
  _getNextInstanceOfTime(time, startDate: 你的自定义起始TZDateTime),
  NotificationDetails(
    android: AndroidNotificationDetails(
      channelId,
      channelName,
      notificationDescription,
      playSound: true,
      styleInformation: DefaultStyleInformation(true, true),
    )
  ),
  uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime,
  androidAllowWhileIdle: true,
  // 新增:配置每日相同时间重复触发
  matchDateTimeComponents: DateTimeComponents.time,
);

2. 时间计算逻辑修改

调整_getNextInstanceOfTime方法,新增起始日期入参,兼容跨起始日期的时间判断:

tz.TZDateTime _getNextInstanceOfTime(TimeOfDay time, {required tz.TZDateTime startDate}) {
  final tz.TZDateTime now = tz.TZDateTime.now(tz.local);
  // 先构造起始日期对应的目标时间点
  tz.TZDateTime scheduled = tz.TZDateTime(tz.local, startDate.year, startDate.month, startDate.day, time.hour, time.minute);
  
  // 如果当前时间已经晚于当前计算的目标时间,就逐天后推直到找到第一个符合条件的触发时间
  while (scheduled.isBefore(now)) {
    scheduled = scheduled.add(const Duration(days: 1));
  }
  return scheduled;
}

注意事项

  • 安卓端需提前申请对应权限:安卓13及以上需申请POST_NOTIFICATIONS通知权限,安卓12及以上需申请SCHEDULE_EXACT_ALARM精确闹钟权限,否则定时通知无法正常触发
  • 传入的起始日期必须是tz.local时区的TZDateTime类型,不要直接使用普通DateTime转换,避免时区偏移导致触发时间错误
  • 相同ID的通知如果重复调用zonedSchedule会覆盖原有调度,初始化时仅需要调用一次即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:39:01