sal65535
sal65535

Reputation: 111

Display a push notification at a scheduled time in Flutter

I have written the code below (fully runnable), when I run the app a notification is displayed but the AlarmManager doesn't work as expected. It doesn't display a notification every minute as I told him... How can I fix it? Thx in advance and keep coding with <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"));
    });
  }
}

Upvotes: 0

Views: 5204

Answers (1)

sal65535
sal65535

Reputation: 111

Finally I found a solution... Here is the full example.

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

First of all, make main() "async" then initialise AndroidAlarmManager;

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

Create alarmManager.dart inside your package, the class inside it is called 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);
  }
}

Then create your callback out of any class in your favourite .dart file (the callback will be called from a background thread created by AndroidAlarmManager);

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

Finally create the background thread from AlarmManager in this way (import in this .dart file the .dart file where the callback is defined:

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())

Keep coding with <3

Upvotes: 5

Related Questions