Flutter使用flutter_local_notifications实现每日多次定时通知问题咨询
修复方案
1. 统一通知插件实例
你代码中存在两个独立的FlutterLocalNotificationsPlugin实例:仅第一个实例执行了初始化逻辑,后续用于调用zonedSchedule的第二个实例未完成初始化,这是后续通知无法触发的核心问题。
全局仅保留一个实例即可,所有逻辑都复用该实例:
// 全局仅初始化一次插件实例 final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); // 初始化逻辑 Future<void> initNotify() async { AndroidInitializationSettings androidInit = AndroidInitializationSettings("icon"); IOSInitializationSettings iosInit = IOSInitializationSettings(); final initSettings = InitializationSettings(android: androidInit, iOS: iosInit); await flutterLocalNotificationsPlugin.initialize(initSettings); }
后续配置通知参数、调用调度方法时,都使用这个已经完成初始化的全局实例,不要重新创建新的实例。
2. 校验调度时间有效性
zonedSchedule会自动忽略触发时间早于当前时间的任务,调用前需要判断所有礼拜时间均晚于当前时间:
final currentTime = tz.TZDateTime.now(location); // 仅调度时间在当前之后的通知 if (prayerTimes.dhuhr!.isAfter(currentTime)) { flutterLocalNotificationsPlugin.zonedSchedule( 1, "title", "dhuhr", tz.TZDateTime.from(prayerTimes.dhuhr!, location), platform, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, androidAllowWhileIdle: true, matchDateTimeComponents: DateTimeComponents.time ); } if (prayerTimes.asr!.isAfter(currentTime)) { flutterLocalNotificationsPlugin.zonedSchedule( 2, "title", "Asr", tz.TZDateTime.from(prayerTimes.asr!, location), platform, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, androidAllowWhileIdle: true, matchDateTimeComponents: DateTimeComponents.time ); }
你当前配置的matchDateTimeComponents: DateTimeComponents.time已经可以实现每日同一时间重复触发通知,无需额外修改。
3. 保证通知ID唯一
不同时段的通知必须使用不同的ID,ID重复会导致新的调度任务覆盖旧任务,你当前用的1、2是符合要求的,后续添加其他礼拜时段时,依次分配3、4、5等唯一ID即可。
4. 安卓端适配后台限制
如果在安卓设备测试,需要做以下配置避免系统拦截通知:
- 在
AndroidManifest.xml中添加SCHEDULE_EXACT_ALARM、USE_EXACT_ALARM权限,适配安卓12及以上版本的精确闹钟权限要求 - 引导用户关闭APP的电池优化,开启自启动权限,避免系统后台清理通知进程
内容的提问来源于stack exchange,提问作者Mohammed Bekele
相关产品推荐
相关产品推荐

