在 Flutter 中的预定时间显示推送通知

Display a push notification at a scheduled time in Flutter

我已经编写了下面的代码(完全 运行 可用),当我 运行 应用程序显示通知但 AlarmManager 没有按预期工作时。它不会像我告诉他的那样每分钟显示一条通知……我该如何解决?提前致谢并继续用 <3

编码
class _MyHomePageState extends State<MyHomePage>
{
  FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
  var initializationSettings;
  var initializationSettingsAndroid;

  @override
  Widget build(BuildContext context)
  {
    initializationSettingsAndroid = new AndroidInitializationSettings("@mipmap/ic_launcher");
    initializationSettings = InitializationSettings(initializationSettingsAndroid, null);
    flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: onSelectNotification);

    createTimer();

    return Scaffold
    (
      appBar: AppBar
      (
        title: Text(widget.title),
      ),
      body: Container()
    );
  }

  void createTimer() async
  {
    final int alarmID = 0;

    showNotificationWithDefaultSound();

    await AndroidAlarmManager.initialize();
    await AndroidAlarmManager.periodic(const Duration(minutes: 1), alarmID, showNotificationWithDefaultSound);
  }

  Future showNotificationWithDefaultSound() async
  {
    var androidPlatformChannelSpecifics = new AndroidNotificationDetails('idNotification', 'AppName', 'Description', importance: Importance.Max, priority: Priority.High);
    var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
    var platformChannelSpecifics = new NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
    await flutterLocalNotificationsPlugin.show(0, 'New Notification', 'This is the text of the notification', platformChannelSpecifics, payload: 'Hi guys and girls!!');
  }

  Future onSelectNotification(String payload) async
  {
    showDialog(context: context, builder: (_)
    {
      return new AlertDialog(title: Text("PayLoad"), content: Text("Payload : $payload"));
    });
  }
}

终于找到解决办法了... 这是完整的例子。

https://github.com/Anon-65535/SimpleBackgroundTimer

首先,使main()"async"然后初始化AndroidAlarmManager

void main() async
{
  WidgetsFlutterBinding.ensureInitialized();
  await AndroidAlarmManager.initialize();
  runApp(MainClass());
}

在你的包里面创建alarmManager.dart,里面的class叫做NotificationManager;

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

class NotificationManager
{
  FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
  AndroidInitializationSettings initializationSettingsAndroid;
  IOSInitializationSettings initializationSettingsIOS;
  InitializationSettings initializationSettings;

  void initNotificationManager()
  {
    initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_launcher');
    initializationSettingsIOS = new IOSInitializationSettings();
    initializationSettings = new InitializationSettings(initializationSettingsAndroid, initializationSettingsIOS);
    flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
    flutterLocalNotificationsPlugin.initialize(initializationSettings);
  }

  void showNotificationWithDefaultSound(String title, String body)
  {
    var androidPlatformChannelSpecifics = new AndroidNotificationDetails('your channel id', 'your channel name', 'your channel description', importance: Importance.Max, priority: Priority.High);
    var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
    var platformChannelSpecifics = new NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
    flutterLocalNotificationsPlugin.show(0, title, body, platformChannelSpecifics);
  }
}

然后从您最喜欢的 .dart 文件中的任何 class 创建回调 (回调将从 [= 创建的后台线程调用) 15=]);

alarmCallback()
{
  NotificationManager n = new NotificationManager();
  n.initNotificationManager();
  n.showNotificationWithDefaultSound("Prova", "Prova");
  print("[*] Called from AlarmManager");
  return;
}

最后以这种方式从 AlarmManager 创建后台线程(在此 .dart 文件中导入定义回调的 .dart 文件:

AndroidAlarmManager.oneShotAt(DateTime.now().add(Duration(seconds: 10)),
                              0,
                              alarmCallback,
                              exact: true,
                              allowWhileIdle: true,
                              wakeup: true,
                              rescheduleOnReboot: true, 
                              alarmClock: true);
//This will call your callback in 10 seconds from now (Datetime.now())

用 <3

继续编码