使用Awesome Notifications设置每日重复通知失效问题求助
解决AwesomeNotifications每日重复通知不生效的问题
不需要切换到Local Notifications,通过以下调整即可修复现有代码的问题:
1. 补充Android权限配置
在android/app/src/main/AndroidManifest.xml中添加精确闹钟相关权限:
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/> <uses-permission android:name="android.permission.USE_EXACT_ALARM"/> <!-- 适配Android 14+版本 -->
同时在运行时请求权限(针对Android 12及以上系统):
if (Platform.isAndroid) { final permissionStatus = await AwesomeNotifications().requestPermissionToSendNotifications( permissions: [NotificationPermission.ScheduleExactAlarm], ); if (!permissionStatus.isAllowed) { // 此处可添加权限拒绝后的提示逻辑,引导用户开启权限 return; } }
2. 完善重复通知的调度规则
在NotificationCalendar中明确指定重复间隔,确保每日重复逻辑生效:
schedule: NotificationCalendar( preciseAlarm: true, allowWhileIdle: true, timeZone: await AwesomeNotifications().getLocalTimeZoneIdentifier(), hour: timeOfDay.hour, minute: timeOfDay.minute, second: 0, millisecond: 0, repeats: true, interval: Interval.Daily, // 新增:明确设置每日重复 firstDate: DateTime.now().add(const Duration(seconds: 1)), // 可选:确保首次触发在当前时间之后,避免立即触发过期时间点 ),
3. 避免通知ID冲突
当前用name.hashCode.abs()作为ID存在哈希碰撞风险,建议改用更唯一的生成方式:
id: int.parse('${name.hashCode.abs()}${DateTime.now().millisecond}'),
4. 处理电池优化限制
Android系统的电池优化会阻止后台通知触发,可引导用户将APP从优化列表中排除:
if (Platform.isAndroid) { await AwesomeNotifications().requestDisableBatteryOptimizations(); }
完整修改后的代码示例
Future<void> createRoutineReminderNotification(TimeOfDay timeOfDay, String name) async { // 处理Android权限与电池优化 if (Platform.isAndroid) { final permissionStatus = await AwesomeNotifications().requestPermissionToSendNotifications( permissions: [NotificationPermission.ScheduleExactAlarm], ); if (!permissionStatus.isAllowed) { // 添加权限拒绝提示逻辑 return; } await AwesomeNotifications().requestDisableBatteryOptimizations(); } await AwesomeNotifications().createNotification( content: NotificationContent( id: int.parse('${name.hashCode.abs()}${DateTime.now().millisecond}'), channelKey: 'scheduled_channel', title: '${Emojis.time_alarm_clock} 别忘了你的${name}习惯哦!', body: '坚持下去,你一定会有收获!', notificationLayout: NotificationLayout.Default, wakeUpScreen: true, category: NotificationCategory.Reminder, ), actionButtons: [ NotificationActionButton( key: 'MARK_DONE', label: '已完成', ), ], schedule: NotificationCalendar( preciseAlarm: true, allowWhileIdle: true, timeZone: await AwesomeNotifications().getLocalTimeZoneIdentifier(), hour: timeOfDay.hour, minute: timeOfDay.minute, second: 0, millisecond: 0, repeats: true, interval: Interval.Daily, firstDate: DateTime.now().add(const Duration(seconds: 1)), ), ); }
内容的提问来源于stack exchange,提问作者Sohatzky
相关产品推荐
相关产品推荐

