import 'dart:async'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; class NotificationHelper { static final NotificationHelper instance = NotificationHelper._init(); final StreamController notificationStreamController = StreamController.broadcast(); Stream get notificationStream => notificationStreamController.stream; final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin(); bool _isInitialized = false; NotificationHelper._init(); Future init() async { const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher'); const InitializationSettings initializationSettings = InitializationSettings( android: initializationSettingsAndroid, ); await _notificationsPlugin.initialize( initializationSettings, onDidReceiveNotificationResponse: (details) { if (details.payload != null) { // This will be handled by the UI listening to a stream or similar // or we can use a global navigator key if available. // For now, we'll use a static notificationStream to let listeners know. notificationStreamController.add(details.payload!); } }, ); _isInitialized = true; } Future showNotification({ required int id, required String title, required String body, String? payload, }) async { if (!_isInitialized) await init(); const AndroidNotificationDetails androidPlatformChannelSpecifics = AndroidNotificationDetails( 'sms_channel', 'SMS Notifications', channelDescription: 'Notifications for incoming secure messages', importance: Importance.max, priority: Priority.high, showWhen: true, ); const NotificationDetails platformChannelSpecifics = NotificationDetails( android: androidPlatformChannelSpecifics, ); await _notificationsPlugin.show( id, title, body, platformChannelSpecifics, payload: payload, ); } }