workmanager 的通知详细信息有误

问题描述 投票:0回答:2

我正在尝试显示一条带有条件信息的通知,该信息会检查 24 小时。我正在与工作经理一起使用

flutter_local_notification
,并且我会在预定时间收到通知。但是,它没有按预期显示消息。 这是我的代码:

class NotificationServices{
  static AndroidNotificationDetails androidSettings;
  static IOSNotificationDetails iosSettings;
  static FlutterLocalNotificationsPlugin fltrNotification;

  static initializer(){
    fltrNotification = FlutterLocalNotificationsPlugin();
    androidSettings = AndroidNotificationDetails(
        'Expiry Id', 'Expiry', 'Expired',
        playSound: true, enableVibration: true,
        importance: Importance.max, priority: Priority.max);
    iosSettings = IOSNotificationDetails();
    var androidInitialize = new AndroidInitializationSettings('exercise_icon');
    var iOSInitialize = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(
        android: androidInitialize, iOS: iOSInitialize);
    fltrNotification.initialize(initializationSettings);
  }



  static showNotification() async {
    var notifDetails =  NotificationDetails(android: androidSettings, iOS: iosSettings);

    List<Member> memList = await checkDate();
    if(memList.isNotEmpty){
      memList.forEach((member) async{
        var scheduledTime = DateTime.parse(member.date);
        final timeZone = TimeZone();
        String timeZoneName = await timeZone.getTimeZoneName();
        final location = await timeZone.getLocation(timeZoneName);
        final scheduledDate = tz.TZDateTime.from(scheduledTime, location).add(Duration(minutes: 35));

        fltrNotification.show(
          member.id,
          'Subscription Notification',
          '${member.surname} ${member.firstName}\'s subscription has expired.',
          notifDetails
        );

        // await fltrNotification.zonedSchedule(
        //     member.id,
        //     'Subscription Notification',
        //     '${member.surname} ${member.firstName}\'s subscription has expired.',
        //     scheduledDate,
        //     notifDetails,
        //     uiLocalNotificationDateInterpretation:
        //     UILocalNotificationDateInterpretation.absoluteTime,
        //     androidAllowWhileIdle: true);
      });
    }

  }
}

这是初始化workmanager的main.dart:

void callbackDispatcher() {
  Workmanager.executeTask((taskName, inputData) {
    NotificationServices.initializer();
    NotificationServices.showNotification();
    return Future.value(true);
  });
}

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Workmanager.initialize(
    callbackDispatcher,
    isInDebugMode: true,
  );

  Workmanager.registerPeriodicTask(
    '4',
    'simplePeriodicTask',
    frequency: Duration(minutes: 15),
  );

  runApp(MyApp());
}


Future<List<Member>>checkDate() async {
  MemberServices memServices = MemberServices();
  List<Member> memList = List<Member>();
  DateTime now = DateTime.now();
  List<Member> membersList = await memServices.getAllMembers();
  membersList.forEach((member) async {
    DateTime expiryDate = DateTime.parse(member.date);
    if (now.isAfter(expiryDate)) {
      member = Member(
          id: member.id,
          surname: member.surname,
          firstName: member.firstName,
          date: member.date,
          active: 'false');
      await memServices.updateMember(member);
      memList.add(member);
    }
  });
  return memList;
}



class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primaryColor: Color(0xFF070707),
        accentColor: Colors.purple[800]
      ),
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }

}

这是我得到的结果

但是没有workmanager它工作得很好。我需要一个情况。

编辑:我尝试在

callbackDispatcher(){}
中打印一条消息,但没有打印。这是没有工作管理器时的样子:

flutter flutter-dependencies android-workmanager
2个回答
0
投票

我刚刚解决了这个实际上很小的问题。 Workmanager 方法是未来,我没有意识到这一点,所以我没有等待它们,其次,我的代码仅在满足特定条件时才调用显示通知,并且每天直到午夜才满足该条件,所以我忽略了该条件暂且。第三,我在 void main 之前将回调和 showNotification 置于顶层。现在我的代码看起来像这样

const simplePeriodicTask = 'simplePeriodicTask';
MemberServices memberServices = MemberServices();

Future _showNotification(fltrNotification) async {

  var androidSettings = AndroidNotificationDetails(
      'Expiry Id', 'Expiry', 'Expired',
      playSound: true, enableVibration: true,
      importance: Importance.max, priority: Priority.max);
  var iosSettings = IOSNotificationDetails();
  var notifDetails =  NotificationDetails(android: androidSettings, iOS: iosSettings);

  await fltrNotification.show(
      1,
      'Subscription Notification',
      'Faith\'s subscription has expired.',
      notifDetails
  );

}

Future<void> main() async{
  WidgetsFlutterBinding.ensureInitialized();
  print('here ****************************************************************');
  await Workmanager.initialize(
    callbackDispatcher,
    isInDebugMode: true,
  );

  print('got here three');
  await Workmanager.registerPeriodicTask(
    '5',
    simplePeriodicTask,
    frequency: Duration(minutes: 15),
    initialDelay: Duration(seconds: 10)
  );

  runApp(MyApp());
}

void callbackDispatcher(){
  print('dispatch -----------------------------------------------------------------');
  Workmanager.executeTask((taskName, inputData) async{
    FlutterLocalNotificationsPlugin fltrNotification = FlutterLocalNotificationsPlugin();
    var androidInitialize = new AndroidInitializationSettings('exercise_icon');
    var iOSInitialize = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(
        android: androidInitialize, iOS: iOSInitialize);
    fltrNotification = new FlutterLocalNotificationsPlugin();
    fltrNotification.initialize(initializationSettings);

    List<Member> memList = await memberServices.checkDate();
    if(memList.isNotEmpty){
      print('if memList ---------------------------------------------------------');
      for(Member m in memList){
        var scheduledTime = DateTime.now();
        final timeZone = TimeZone();
        String timeZoneName = await timeZone.getTimeZoneName();
        final location = await timeZone.getLocation(timeZoneName);
        final scheduledDate = tz.TZDateTime.from(scheduledTime, location).add(Duration(seconds: 20));
        print('here ==================================================================');

        // await fltrNotification.zonedSchedule(
        //     m.id,
        //     'Subscription Notification',
        //     '${m.surname} ${m.firstName}\'s subscription has expired.',
        //     scheduledDate,
        //     notifDetails,
        //     uiLocalNotificationDateInterpretation:
        //     UILocalNotificationDateInterpretation.absoluteTime,
        //     androidAllowWhileIdle: true);
      }
    }

    _showNotification(fltrNotification);
    print('execute ___________________________________________________________');

    return Future.value(true);
  });
}

我必须打印检查点才能知道我的代码哪里有问题。现在我的通知看起来像这样,它应该是这样的;


0
投票

尝试执行 isInDebugMode: false

Workmanager().initialize(callbackDispatcher, isInDebugMode: fale);

希望这能正常工作:)

© www.soinside.com 2019 - 2024. All rights reserved.