import 'dart:async'; import 'package:core/utils/app_logger.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; class FcmService { StreamController>? backgroundMessageStreamController; StreamController? fcmTokenStreamController; FcmService._internal(); static final FcmService _instance = FcmService._internal(); static FcmService get instance => _instance; void handleFirebaseBackgroundMessage(RemoteMessage newRemoteMessage) { log('FcmService::handleFirebaseBackgroundMessage():data: ${newRemoteMessage.data}'); if (newRemoteMessage.data.isNotEmpty) { backgroundMessageStreamController?.add(newRemoteMessage.data); } } void handleToken(String? token) { log('FcmService::handleToken():token: $token'); fcmTokenStreamController?.add(token); } void initialStreamController() { log('FcmService::initialStreamController:'); backgroundMessageStreamController = StreamController>.broadcast(); fcmTokenStreamController = StreamController.broadcast(); } Future closeStream() async { try { await backgroundMessageStreamController?.close(); } catch (e) { logWarning( 'FcmService::closeStream: backgroundMessageStreamController throw exception: $e', ); } finally { backgroundMessageStreamController = null; } try { await fcmTokenStreamController?.close(); } catch (e) { logWarning( 'FcmService::closeStream: fcmTokenStreamController throw exception: $e', ); } finally { fcmTokenStreamController = null; } } }