Flutter local notifications如何从指定日期开始设置每日定时通知
Flutter本地通知从指定日期开始每日重复推送解决方案
核心问题说明
原有代码仅能触发一次的核心原因有两个:
- 调用
zonedSchedule时没有配置重复触发规则,插件默认仅执行一次通知调度 - 时间计算逻辑没有兼容「当前时间早于起始日期」「当前时间晚于起始日期」两种场景
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
相关产品推荐
相关产品推荐

