Flutter如何设置未来启动的重复通知?flutter_local_notifications问题求助
解决flutter_local_notifications zonedSchedule提前触发重复通知的问题
你遇到的问题是因为zonedSchedule在设置重复规则时,会默认寻找当前时间之后最近的匹配时间点。当前是3月3日10:00,若没明确指定起始日期为3月6日9:00,系统会自动把下一个9:00(3月4日9:00)作为第一次触发时间,导致提前启动重复通知。
以下是两种可靠的解决方案:
方案一:直接指定正确的起始日期
直接构造3月6日9:00的TZDateTime作为触发起始点,确保该时间在当前时间之后,再设置每日重复规则即可。
代码示例
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:timezone/timezone.dart' as tz; final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); // 初始化通知插件(按官方文档完成平台配置,此处省略) void setupDailyMedicationNotification() async { // 构造目标起始时间:2024年3月6日9:00 final targetDate = tz.TZDateTime.local(2024, 3, 6, 9, 0); // 确保目标时间在当前时间之后,避免触发过去的通知 if (targetDate.isAfter(tz.TZDateTime.now())) { await flutterLocalNotificationsPlugin.zonedSchedule( 0, // 唯一通知ID '服药提醒', '该吃药啦!', targetDate, const NotificationDetails( android: AndroidNotificationDetails( 'medication_channel', '每日服药提醒', channelDescription: '固定每天9:00提醒用户服药', importance: Importance.high, ), iOS: IOSNotificationDetails(), ), androidAllowWhileIdle: true, // 锁屏或低电量时仍能触发 uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, repeatInterval: RepeatInterval.daily, // 设置每日重复 ); } }
方案二:先触发单次通知,再开启重复
如果担心时区或日期计算出错,可以先设置一个单次通知在3月6日9:00触发,待该通知触发后,再在回调中启动每日重复通知。这种方式能确保第一次触发时间完全符合预期。
代码示例
void setupMedicationNotification() async { // 1. 设置3月6日9:00的单次通知 final firstTriggerDate = tz.TZDateTime.local(2024, 3, 6, 9, 0); await flutterLocalNotificationsPlugin.zonedSchedule( 1, // 单次通知ID '服药提醒', '该吃药啦!', firstTriggerDate, const NotificationDetails( android: AndroidNotificationDetails( 'medication_channel', '每日服药提醒', channelDescription: '固定每天9:00提醒用户服药', ), ), androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, // 不设置repeatInterval,作为单次通知 ); // 2. 初始化插件时监听通知触发事件 await flutterLocalNotificationsPlugin.initialize( const InitializationSettings( android: AndroidInitializationSettings('@mipmap/ic_launcher'), iOS: IOSInitializationSettings(), ), onDidReceiveNotificationResponse: (response) async { // 匹配单次通知的ID,触发后开启重复通知 if (response.id == 1) { final nextTriggerDate = tz.TZDateTime.local(2024, 3, 7, 9, 0); await flutterLocalNotificationsPlugin.zonedSchedule( 2, // 重复通知ID(避免与单次通知冲突) '服药提醒', '该吃药啦!', nextTriggerDate, const NotificationDetails( android: AndroidNotificationDetails( 'medication_channel', '每日服药提醒', channelDescription: '固定每天9:00提醒用户服药', ), ), androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, repeatInterval: RepeatInterval.daily, ); } }, ); }
注意事项
- 确保
timezone包已正确配置,避免时区偏差导致时间计算错误。 - Android平台需在
AndroidManifest.xml中配置通知渠道,iOS需开启通知权限。
内容的提问来源于stack exchange,提问作者Priyanshu Gupta
相关产品推荐
相关产品推荐

