ensureTrayDisplayReady static method

  1. @visibleForTesting
Future<void> ensureTrayDisplayReady({
  1. bool background = false,
})

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;
  }
}