You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:07:45