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

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,提问作者مجهول

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:27:34