73 lines
2.5 KiB
Dart
73 lines
2.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
|
|
|
class NotificationService {
|
|
static final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
|
|
FlutterLocalNotificationsPlugin();
|
|
|
|
static Future<void> init() async {
|
|
const AndroidInitializationSettings initializationSettingsAndroid =
|
|
AndroidInitializationSettings('logo');
|
|
|
|
const DarwinInitializationSettings initializationSettingsIOS =
|
|
DarwinInitializationSettings(
|
|
requestAlertPermission: true,
|
|
requestBadgePermission: true,
|
|
requestSoundPermission: true,
|
|
);
|
|
|
|
const InitializationSettings initializationSettings =
|
|
InitializationSettings(
|
|
android: initializationSettingsAndroid,
|
|
iOS: initializationSettingsIOS,
|
|
);
|
|
|
|
await flutterLocalNotificationsPlugin.initialize(
|
|
initializationSettings,
|
|
onDidReceiveNotificationResponse: (NotificationResponse response) {
|
|
// Handle tap on notification
|
|
debugPrint("🔔 Notification clicked: ${response.payload}");
|
|
},
|
|
);
|
|
|
|
// Listen when app is in foreground
|
|
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
|
|
_showNotification(message);
|
|
});
|
|
|
|
// Optional: listen when user taps notification while app is in background/terminated
|
|
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
|
|
debugPrint(
|
|
"📲 App opened via notification: ${message.notification?.title}");
|
|
// Navigate to specific screen if needed
|
|
});
|
|
}
|
|
|
|
static Future<void> _showNotification(RemoteMessage message) async {
|
|
RemoteNotification? notification = message.notification;
|
|
AndroidNotification? android = message.notification?.android;
|
|
|
|
if (notification != null && android != null) {
|
|
const AndroidNotificationDetails androidDetails =
|
|
AndroidNotificationDetails(
|
|
'high_importance_channel', // Match with AndroidManifest.xml
|
|
'High Importance Notifications',
|
|
channelDescription: 'Used for important notifications.',
|
|
importance: Importance.max,
|
|
priority: Priority.high,
|
|
);
|
|
|
|
const NotificationDetails platformDetails =
|
|
NotificationDetails(android: androidDetails);
|
|
|
|
await flutterLocalNotificationsPlugin.show(
|
|
notification.hashCode,
|
|
notification.title,
|
|
notification.body,
|
|
platformDetails,
|
|
);
|
|
}
|
|
}
|
|
}
|