Flutter中WorkManager调用Awesome Notifications定时通知失效问题
问题:WorkManager调用带定时配置的AwesomeNotifications通知失效
我用Awesome_notifications包实现重复定时通知时遇到以下问题:
- 通过WorkManager调用带
schedule配置的通知时,通知无法正常触发 - 移除
schedule相关代码后,WorkManager可以正常触发通知
定时配置代码(移除后通知恢复正常)
schedule:NotificationCalendar( // allowWhileIdle:true, // preciseAlarm: true, hour:18, minute:13, second: 0, //repeats: true, ),
main初始化代码
await Future.wait([ Notify.initializeNotification(), WorkmanagerServise().init(), ]);
Notify类代码
import 'dart:math'; import 'package:adhdhkar_muslim/Alaidhikar/sabah.dart'; import 'package:adhdhkar_muslim/main.dart'; import 'package:adhdhkar_muslim/virb_uli.dart'; import 'package:awesome_notifications/awesome_notifications.dart'; import 'package:flutter/material.dart'; import 'package:timezone/timezone.dart' as tz; import 'package:timezone/data/latest.dart' as tz; //اذكار الصباح class Notify{ static Future initializeNotification() async { //AwesomeNotifications().requestPermissionToSendNotifications(); AwesomeNotifications().initialize( null, [ NotificationChannel( channelKey: 'basic_key', channelName: 'chnneladhs', channelDescription: 'fghjk', importance: NotificationImportance.Max, //channelShowBadge:true, defaultRingtoneType: DefaultRingtoneType.Notification, onlyAlertOnce: true, ), ], debug: true, ); await AwesomeNotifications().setListeners( onActionReceivedMethod: onActionReceivedMethod, ); } /// 监听通知点击或按钮操作 static Future<void> onActionReceivedMethod( ReceivedAction receivedAction) async { debugPrint('onActionReceivedMethod'); final payload = receivedAction.payload ?? {}; if (payload["navigate"] == "true") { MyApp.navigatorKey.currentState?.push( MaterialPageRoute( builder: (_) => const SabahADH(), ), ); } } static Future<bool> scheduleNotification() async { final AwesomeNotifications awesomeNotifications = AwesomeNotifications(); return await awesomeNotifications.createNotification( schedule:NotificationCalendar( // allowWhileIdle:true, // preciseAlarm: true, hour:18, minute:13, second: 0, //repeats: true, ), content: NotificationContent( // icon: 'resource://mipmap/shado', id:1, title: "اذكار الصباح", // body: "", channelKey: 'basic_key', wakeUpScreen: true, autoDismissible: false, category: NotificationCategory.Reminder, payload: { "navigate": "true", }, ), ); } static Future<void> retrieveScheduledNotifications() async { final AwesomeNotifications awesomeNotifications = AwesomeNotifications(); List<NotificationModel> scheduledNotifications = await awesomeNotifications.listScheduledNotifications(); print(scheduledNotifications); } }
WorkManager相关代码
// ignore: file_names, depend_on_referenced_packages import 'package:adhdhkar_muslim/Notf.dart'; import 'package:adhdhkar_muslim/Notf.dart'; import 'package:adhdhkar_muslim/nottfi.dart'; import 'package:adhdhkar_muslim/virb_uli.dart'; import 'package:workmanager/workmanager.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; // ignore: camel_case_types class WorkmanagerServise { void registerMyTack() async { await Workmanager().registerOneOffTask( 'id77', 'show Notfadk', //frequency: const Duration(minutes: 15), ); } // 初始化 Future<void> init () async { await Workmanager().initialize(actionTask,isInDebugMode: true); registerMyTack(); } void cancelText(String id ){ Workmanager().cancelByUniqueName(id); } } @pragma('vm:entry-point') void actionTask() { Workmanager().executeTask((taskName, inputData){ Notify.scheduleNotification(); return Future.value(true); }); }
解决方案
1. 补全时区初始化
Notify类中导入了timezone包但未初始化,会导致定时时间计算错误,在initializeNotification方法中添加初始化代码:
static Future initializeNotification() async { tz.initializeTimeZones(); // 新增该行 // ... 原有初始化代码 }
2. 修复WorkManager中的异步调用
scheduleNotification是异步方法,需等待执行完成后再结束WorkManager任务:
@pragma('vm:entry-point') void actionTask() { Workmanager().executeTask((taskName, inputData) async { // 改为async方法 await Notify.scheduleNotification(); // 等待异步方法完成 return Future.value(true); }); }
3. 完善权限配置
- 开启通知权限请求,取消
initializeNotification中权限请求的注释:await AwesomeNotifications().requestPermissionToSendNotifications(); - 若需要精确定时,取消
NotificationCalendar中preciseAlarm: true的注释,并在AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
4. 避免通知ID冲突
固定使用id:1会覆盖之前的定时任务,改为生成随机唯一ID:
id: Random().nextInt(10000), // 替换原有id:1
5. 验证定时任务状态
调用Notify.retrieveScheduledNotifications()打印已创建的定时任务,确认任务是否被正确添加。
内容的提问来源于stack exchange,提问作者مجهول
相关产品推荐
相关产品推荐

