ensureTrayDisplayReady static method
Initializes FlutterLocalNotificationsPlugin for tray display.
When background is true (FCM background isolate), skips Android
requestNotificationsPermission — there is no Activity context and the
call throws. Permission should be requested in main / foreground only.
Implementation
@visibleForTesting
static Future<void> ensureTrayDisplayReady({bool background = false}) async {
if (background) {
if (_backgroundTrayReady) {
return;
}
} else if (_initialized) {
return;
}
if (!background && Platform.isIOS) {
await FirebaseMessaging.instance
.setForegroundNotificationPresentationOptions(
alert: true,
badge: true,
sound: true,
);
}
const androidSettings = AndroidInitializationSettings('@mipmap/ic_launcher');
const iosSettings = DarwinInitializationSettings();
await _plugin.initialize(
settings: const InitializationSettings(
android: androidSettings,
iOS: iosSettings,
),
onDidReceiveNotificationResponse: _onNotificationResponse,
);
if (Platform.isAndroid && !background) {
await _plugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.requestNotificationsPermission();
}
if (background) {
_backgroundTrayReady = true;
}
}