import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:timezone/data/latest.dart'; import 'package:timezone/timezone.dart'; const details = NotificationDetails( android: AndroidNotificationDetails( 'hrt', 'HRT', autoCancel: false, styleInformation: BigPictureStyleInformation( DrawableResourceAndroidBitmap('take_your_hrt'), ), importance: Importance.max, ongoing: true, actions: [AndroidNotificationAction("confirmation", "Done!")], ), ); void _initializePlugin() async { var initialized = await FlutterLocalNotificationsPlugin().initialize( const InitializationSettings( android: AndroidInitializationSettings('estrogen'), ), ); if (initialized != true) { throw "Not initialized"; } } void sendNotification() async { _initializePlugin(); await FlutterLocalNotificationsPlugin().show( 1, null, null, details, ); } void scheduleNotification() async { _initializePlugin(); initializeTimeZones(); // [Hours, Minutes] var times = [ [12, 00], [18, 00], ]; if (times.isEmpty) return; var currentTime = TZDateTime.now(local); // Map the time entries to TZDateTime objects var notificationTimes = times .map((item) => TZDateTime( local, currentTime.year, currentTime.month, currentTime.day, item[0], item[1], )) .toList(); // For all entries in the past, add 1 day for (var time in notificationTimes .where((element) => element.compareTo(currentTime) < 0)) { time.add(const Duration(days: 1)); } // Sort the array so we can find the closest time notificationTimes.sort((a, b) => a.compareTo(b)); await FlutterLocalNotificationsPlugin().zonedSchedule( 1, null, null, notificationTimes[0], details, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, ); }