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

Flutter Awesome Notifications调用cancelAllSchedules无法取消定时通知

awesome_notifications 定时通知无法取消排查解决方案

调用cancelAllSchedules()返回成功但通知仍触发,按以下顺序排查修复:

  • 先验证插件侧调度记录清空状态:执行取消方法后立刻调用await AwesomeNotifications().listScheduledNotifications()打印返回结果,如果列表不为空,属于插件版本bug:0.7.x及更早版本在安卓13、iOS16系统上存在cancelAllSchedules()仅清空本地缓存、未调用系统通知服务接口的问题,直接升级到最新稳定版即可修复。
  • 如果上述接口返回空列表但通知仍按时触发,属于系统层面残留调度任务,分平台处理:
    • 安卓端
      • 安卓12及以上设备先检查精确闹钟权限,未授权时插件创建的定时通知会走系统模糊调度通道,插件自身无权限清除这部分排期任务,先引导用户开启SCHEDULE_EXACT_ALARM权限后再执行取消,也可在原生层调用AlarmManager接口清除当前应用名下所有闹钟任务做兜底。
      • 检查通知创建配置:如果创建时设置了persistent: true常驻通知属性、或者使用了自定义重复规则的调度任务,部分国产ROM会将这类任务加入系统自启动保活队列,不会响应插件的批量取消指令。这种场景不要仅依赖cancelAllSchedules(),遍历业务侧存储的所有通知ID,逐个调用cancel(notificationId)执行取消。
      • 避免在应用后台被系统冻结状态下调用取消方法,此时await返回的成功仅代表插件本地数据库操作完成,取消指令未同步到系统通知服务,将应用切到前台后重新执行取消操作即可。
    • iOS端
      • 检查通知监听回调(displayedStream、actionStream等)中是否存在重新创建定时通知的逻辑,这类逻辑会导致取消后立刻重新生成调度任务,表现为取消失效。
      • 旧版本插件中通过zonedSchedule创建的跨时区定时通知会重复注册多个不同时区的调度任务,cancelAllSchedules()仅能清除当前时区对应任务,升级插件版本或逐个ID取消即可解决。
  • 通用兜底方案:业务侧自行维护所有已创建定时通知的ID列表,取消操作时先调用cancelAllSchedules(),再遍历ID列表逐个调用cancel();每次应用冷启动时额外执行一次上述取消逻辑,清理系统残留的调度任务。

内容的提问来源于stack exchange,提问作者yusuf nadaroğlu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:06:27