在Flutter中按计划的时间显示推送通知

时间:2020-01-01 22:24:23

标签: android flutter alarmmanager

我已经在下面编写了代码(可完全运行),当我运行该应用程序时,会显示一条通知,但AlarmManager无法按预期工作。正如我告诉他的那样,它不会每分钟显示一条通知...我该如何解决?提前Thx并保持<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"));
    });
  }
}

1 个答案:

答案 0 :(得分:2)

最后我找到了解决方案... 这是完整的示例。

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

首先,使main() “异步” 然后初始化AndroidAlarmManager;

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

在包中创建alarmManager.dart,其中的类称为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文件中创建任何类的回调 (该回调将从AndroidAlarmManager创建的后台线程中调用);

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

编码
相关问题