import 'package:flutter_local_notifications/flutter_local_notifications.dart'; class NotifService { static final FlutterLocalNotificationsPlugin _notif = FlutterLocalNotificationsPlugin(); static Future init() async { const android = AndroidInitializationSettings('@mipmap/ic_launcher'); const settings = InitializationSettings(android: android); await _notif.initialize(settings); // Mendaftarkan pintu gerbang utama channel melayang ke OS Android final androidImplementation = _notif .resolvePlatformSpecificImplementation< AndroidFlutterLocalNotificationsPlugin >(); if (androidImplementation != null) { // Meminta izin notifikasi langsung ke layar HP saat aplikasi dibuka await androidImplementation.requestNotificationsPermission(); const channel = AndroidNotificationChannel( 'channel_kebun_id', // Wajib sama persis dengan yang ada di AndroidManifest.xml 'Notifikasi Burung', description: 'Mendeteksi pergerakan hama burung kebun', importance: Importance.max, // Memaksa spanduk muncul di atas layar playSound: true, enableVibration: true, ); await androidImplementation.createNotificationChannel(channel); } } static Future showNotif(String title, String body) async { const androidDetails = AndroidNotificationDetails( 'channel_kebun_id', // Disamakan dengan manifest & init channel di atas 'Notifikasi Burung', importance: Importance.max, priority: Priority.high, ticker: 'ticker', icon: '@mipmap/ic_launcher', ); const details = NotificationDetails(android: androidDetails); // Membuat ID Notifikasi acak berbasis waktu agar setiap notifikasi baru tidak saling menimpa int idUnik = DateTime.now().millisecondsSinceEpoch ~/ 1000; await _notif.show(idUnik, title, body, details); } }