77 lines
2.5 KiB
Dart
77 lines
2.5 KiB
Dart
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
|
import 'package:timezone/data/latest_all.dart' as tz;
|
|
import 'package:timezone/timezone.dart' as tz;
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
class NotificationService {
|
|
static final NotificationService _instance = NotificationService._internal();
|
|
factory NotificationService() => _instance;
|
|
NotificationService._internal();
|
|
|
|
final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
|
|
bool _initialized = false;
|
|
|
|
Future<void> initialize() async {
|
|
if (_initialized) return;
|
|
|
|
tz.initializeTimeZones();
|
|
|
|
const AndroidInitializationSettings initializationSettingsAndroid =
|
|
AndroidInitializationSettings('@mipmap/ic_launcher');
|
|
|
|
final DarwinInitializationSettings initializationSettingsDarwin =
|
|
DarwinInitializationSettings(
|
|
requestAlertPermission: true,
|
|
requestBadgePermission: true,
|
|
requestSoundPermission: true,
|
|
);
|
|
|
|
final InitializationSettings initializationSettings = InitializationSettings(
|
|
android: initializationSettingsAndroid,
|
|
iOS: initializationSettingsDarwin,
|
|
);
|
|
|
|
await _flutterLocalNotificationsPlugin.initialize(settings: initializationSettings);
|
|
_initialized = true;
|
|
}
|
|
|
|
Future<void> scheduleNotification({
|
|
required int id,
|
|
required String title,
|
|
required String body,
|
|
required DateTime scheduledDate,
|
|
}) async {
|
|
if (!_initialized) await initialize();
|
|
|
|
try {
|
|
await _flutterLocalNotificationsPlugin.zonedSchedule(
|
|
id: id,
|
|
title: title,
|
|
body: body,
|
|
scheduledDate: tz.TZDateTime.from(scheduledDate, tz.local),
|
|
notificationDetails: const NotificationDetails(
|
|
android: AndroidNotificationDetails(
|
|
'payables_alerts_channel',
|
|
'Payables Alerts',
|
|
channelDescription: 'Notifications for upcoming payable due dates',
|
|
importance: Importance.max,
|
|
priority: Priority.high,
|
|
),
|
|
iOS: DarwinNotificationDetails(
|
|
presentAlert: true,
|
|
presentBadge: true,
|
|
presentSound: true,
|
|
),
|
|
),
|
|
androidScheduleMode: AndroidScheduleMode.exactAllowWhileIdle,
|
|
);
|
|
} catch (e) {
|
|
debugPrint('Error scheduling notification: $e');
|
|
}
|
|
}
|
|
|
|
Future<void> cancelNotification(int id) async {
|
|
await _flutterLocalNotificationsPlugin.cancel(id: id);
|
|
}
|
|
}
|