如何用Awesome Notifications实现每日重复祈祷时间通知?
解决Awesome Notifications每日重复通知不生效的问题
问题分析
你当前的代码用NotificationCalendar.fromDate设置repeats: true,但这种方式没法触发每日重复——fromDate生成的日历对象只绑定了具体日期,没明确指定每日重复规则,系统只会在指定日期触发一次,不会自动循环。
解决方案
直接构造NotificationCalendar对象,明确指定小时、分钟并开启每日重复规则,同时处理当前时间已过目标时间的情况(避免刚设置就触发通知):
修改后的代码
void scheduleNotification(int id) async { DateTime now = DateTime.now(); List<int> timeParts = prayerTimes[id].split(':').map(int.parse).toList(); int targetHour = timeParts[0]; int targetMinute = timeParts[1]; // 计算首次触发时间:如果当前时间已过目标时间,就设为第二天的同一时间 DateTime scheduledDate = DateTime(now.year, now.month, now.day, targetHour, targetMinute); if (scheduledDate.isBefore(now)) { scheduledDate = scheduledDate.add(const Duration(days: 1)); } String localTimeZone = await AwesomeNotifications().getLocalTimeZoneIdentifier(); await AwesomeNotifications().createNotification( content: NotificationContent( id: id, channelKey: 'basic key', title: 'Prayer Time Notification${Emojis.clothing_prayer_beads}', body: 'It\'s time for prayer!', bigPicture: 'asset://assets/adhan.png', notificationLayout: NotificationLayout.BigPicture, wakeUpScreen: true, locked: true, autoDismissible: false, ), schedule: NotificationCalendar( hour: targetHour, minute: targetMinute, second: 0, repeats: true, // 开启每日重复 preciseAlarm: true, allowWhileIdle: true, timeZone: localTimeZone, // 指定本地时区,避免时间偏移 ), ); }
关键修改点
- 替换
fromDate为显式日历参数:直接指定hour、minute,让系统明确识别每日同一时间重复触发的规则。 - 处理时间过期场景:若当前时间已过当日祈祷时间,将首次触发时间延后至次日,避免误触发。
- 指定时区:添加
timeZone参数,确保通知在用户本地时区的正确时间触发。
额外注意事项
- 在
AndroidManifest.xml中配置必要权限:<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /> <uses-permission android:name="android.permission.USE_EXACT_ALARM" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> - 运行时请求用户授权精确闹钟权限(Android 12+要求):
await AwesomeNotifications().requestPermissionToSendNotifications( permissions: [ NotificationPermission.Alert, NotificationPermission.Sound, NotificationPermission.Badge, NotificationPermission.LockScreen, NotificationPermission.PreciseAlarm, ], );
内容的提问来源于stack exchange,提问作者Mohamed Reda
相关产品推荐
相关产品推荐

