Anonymous
Двойные уведомления в обмене сообщениями Flutter Firebase
Сообщение
Anonymous » 03 окт 2025, 10:51
Недавно я обновлен до firebase_messaging: ^10.0.0, когда приложение не работает, и если уведомление приходит, оно отображается дважды. Я изменил данные уведомления в коде после получения и отображения их. Даже тогда я вижу модифицированные и не модифицированные уведомления. Я не знаю, куда запускается это уведомление. Но когда приложение работает, он отображает уведомление только один раз (работает нормально). Вот мой код < /p>
Код: Выделить всё
/*main.dart*/
Future firebaseMessagingBackgroundHandler(RemoteMessage message) async {
// If you're going to use other Firebase services in the background, such as Firestore,
// make sure you call `initializeApp` before using other Firebase services.
//await Firebase.initializeApp();
// await HomePageState.handleMessage(message);
String title="${message.notification!.title}";
String body="${message.notification!.body}";
_flutterLocalNotificationsPlugin.show(0, title, body, platformChannelSpecifics, payload: jsonEncode(message.data));
AppDatabase database= await $FloorAppDatabase.databaseBuilder(Constants.dataBaseName).addMigrations([migration1to2]).build();
if(!title.toLowerCase().contains("cancelled")){
var date=DateFormat("dd-MMM-yyyy hh:mm aa").format(DateTime.now());
NotificationModel notification=NotificationModel(title: title,message: body,read: 0,date: date);
await database.notificationDao.insertNotification(notification);
}
print("Handling a background message: ${message.messageId}");
}
Future main() async {
//this line make sure all the required widgets are loaded before main application starts
//SharedPreferences.setMockInitialValues({});
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
var initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_notification');
var initializationSettingsIOS = new IOSInitializationSettings(onDidReceiveLocalNotification: onDidReceiveLocalNotification);
//var initializationSettings = new InitializationSettings(initializationSettingsAndroid, initializationSettingsIOS);
var initializationSettings = new InitializationSettings(android: initializationSettingsAndroid,iOS: initializationSettingsIOS);
_flutterLocalNotificationsPlugin.initialize(initializationSettings,onSelectNotification: onSelectingNotification);
FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);
//Initializing repository and carrying forward to avoid multiple instances of database
Repository _repository = Repository();
// runApp(BlocProvider(
// create: (_) => ThemeBloc()..add(ThemeLoadStarted()),
// child: MyApp(
// repository: _repository,
// ),
// ));
SentryOptions options=SentryOptions(dsn: APIs.sentryAPI);
final SentryClient _sentry = SentryClient(options);
Future _reportErrorToSentry(dynamic error, dynamic stackTrace) async {
// Print the exception to the console.
print('Caught error: $error');
await _sentry.captureException(
error,
stackTrace: stackTrace,
);
}
runZonedGuarded(() async{
// runApp(BlocProvider(
// create: (_) => ThemeBloc()..add(ThemeLoadStarted()),
// child: MyApp(
// repository: _repository,
// ),
// ));
await SentryFlutter.init(
(options) => options.dsn = APIs.sentryAPI,
appRunner: () => runApp(BlocProvider(
create: (_) => ThemeBloc()..add(ThemeLoadStarted()),
child: MyApp(
repository: _repository,
),
)),
);
}, (error, stackTrace) {
print('runZonedGuarded: Caught error in my root zone.');
FirebaseCrashlytics.instance.recordError(error, stackTrace);
_reportErrorToSentry(error,stackTrace);
});
}
< /code>
application.kt
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingBackgroundService
class Application : FlutterApplication(), PluginRegistrantCallback {
override fun registerWith(registry: PluginRegistry) {
//FirebaseCloudMessagingPluginRegistrant.registerWith(registry)
FlutterLocalNotificationPluginRegistrant.registerWith(registry)
SqflitePluginRegistrant.registerWith(registry)
}
}
< /code>
firebasecloudmessagingpluginregistrant.kt, который я прокомментировал в Application.kt < /p>
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin
class FirebaseCloudMessagingPluginRegistrant {
companion object {
fun registerWith(registry: PluginRegistry) {
if (alreadyRegisteredWith(registry)) {
return
}
FlutterFirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"))
}
fun alreadyRegisteredWith(registry: PluginRegistry): Boolean {
val key = FirebaseCloudMessagingPluginRegistrant::class.java.name
if (registry.hasPlugin(key)) {
return true
}
registry.registrarFor(key)
return false
}
}
}
< /code>
android manifest.xml
Эта проблема также находится в Android, а также только при приложении. Где я делаю не так?
Подробнее здесь:
https://stackoverflow.com/questions/678 ... -messaging
1759477865
Anonymous
Недавно я обновлен до firebase_messaging: ^10.0.0, когда приложение не работает, и если уведомление приходит, оно отображается дважды. Я изменил данные уведомления в коде после получения и отображения их. Даже тогда я вижу модифицированные и не модифицированные уведомления. Я не знаю, куда запускается это уведомление. Но когда приложение работает, он отображает уведомление только один раз (работает нормально). Вот мой код < /p> [code]/*main.dart*/ Future firebaseMessagingBackgroundHandler(RemoteMessage message) async { // If you're going to use other Firebase services in the background, such as Firestore, // make sure you call `initializeApp` before using other Firebase services. //await Firebase.initializeApp(); // await HomePageState.handleMessage(message); String title="${message.notification!.title}"; String body="${message.notification!.body}"; _flutterLocalNotificationsPlugin.show(0, title, body, platformChannelSpecifics, payload: jsonEncode(message.data)); AppDatabase database= await $FloorAppDatabase.databaseBuilder(Constants.dataBaseName).addMigrations([migration1to2]).build(); if(!title.toLowerCase().contains("cancelled")){ var date=DateFormat("dd-MMM-yyyy hh:mm aa").format(DateTime.now()); NotificationModel notification=NotificationModel(title: title,message: body,read: 0,date: date); await database.notificationDao.insertNotification(notification); } print("Handling a background message: ${message.messageId}"); } Future main() async { //this line make sure all the required widgets are loaded before main application starts //SharedPreferences.setMockInitialValues({}); WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); var initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_notification'); var initializationSettingsIOS = new IOSInitializationSettings(onDidReceiveLocalNotification: onDidReceiveLocalNotification); //var initializationSettings = new InitializationSettings(initializationSettingsAndroid, initializationSettingsIOS); var initializationSettings = new InitializationSettings(android: initializationSettingsAndroid,iOS: initializationSettingsIOS); _flutterLocalNotificationsPlugin.initialize(initializationSettings,onSelectNotification: onSelectingNotification); FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler); //Initializing repository and carrying forward to avoid multiple instances of database Repository _repository = Repository(); // runApp(BlocProvider( // create: (_) => ThemeBloc()..add(ThemeLoadStarted()), // child: MyApp( // repository: _repository, // ), // )); SentryOptions options=SentryOptions(dsn: APIs.sentryAPI); final SentryClient _sentry = SentryClient(options); Future _reportErrorToSentry(dynamic error, dynamic stackTrace) async { // Print the exception to the console. print('Caught error: $error'); await _sentry.captureException( error, stackTrace: stackTrace, ); } runZonedGuarded(() async{ // runApp(BlocProvider( // create: (_) => ThemeBloc()..add(ThemeLoadStarted()), // child: MyApp( // repository: _repository, // ), // )); await SentryFlutter.init( (options) => options.dsn = APIs.sentryAPI, appRunner: () => runApp(BlocProvider( create: (_) => ThemeBloc()..add(ThemeLoadStarted()), child: MyApp( repository: _repository, ), )), ); }, (error, stackTrace) { print('runZonedGuarded: Caught error in my root zone.'); FirebaseCrashlytics.instance.recordError(error, stackTrace); _reportErrorToSentry(error,stackTrace); }); } < /code> application.kt import io.flutter.app.FlutterApplication import io.flutter.plugin.common.PluginRegistry import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback import io.flutter.plugins.GeneratedPluginRegistrant import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingBackgroundService class Application : FlutterApplication(), PluginRegistrantCallback { override fun registerWith(registry: PluginRegistry) { //FirebaseCloudMessagingPluginRegistrant.registerWith(registry) FlutterLocalNotificationPluginRegistrant.registerWith(registry) SqflitePluginRegistrant.registerWith(registry) } } < /code> firebasecloudmessagingpluginregistrant.kt, который я прокомментировал в Application.kt < /p> import io.flutter.plugin.common.PluginRegistry import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin class FirebaseCloudMessagingPluginRegistrant { companion object { fun registerWith(registry: PluginRegistry) { if (alreadyRegisteredWith(registry)) { return } FlutterFirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin")) } fun alreadyRegisteredWith(registry: PluginRegistry): Boolean { val key = FirebaseCloudMessagingPluginRegistrant::class.java.name if (registry.hasPlugin(key)) { return true } registry.registrarFor(key) return false } } } < /code> android manifest.xml [/code] Эта проблема также находится в Android, а также только при приложении. Где я делаю не так? Подробнее здесь: [url]https://stackoverflow.com/questions/67820474/double-notifications-in-flutter-firebase-messaging[/url]