Firebase 颤振-FCM由于未注册onBackgroundMessage处理程序,因此无法在Dart中处理背景消息
我想在颤振中处理FCM的背景消息,但当FCM在后台模式下向应用程序发送消息时出错,并在日志中出错 pubspec.yaml:Firebase 颤振-FCM由于未注册onBackgroundMessage处理程序,因此无法在Dart中处理背景消息,firebase,flutter,firebase-cloud-messaging,flutter-method-channel,Firebase,Flutter,Firebase Cloud Messaging,Flutter Method Channel,我想在颤振中处理FCM的背景消息,但当FCM在后台模式下向应用程序发送消息时出错,并在日志中出错 pubspec.yaml: firebase_core: ^0.7.0 firebase_messaging: ^8.0.0-dev.14 MainActivity.kt: package com.mydomain.myproject import io.flutter.embedding.android.FlutterActivity class MainActivity: Flutter
firebase_core: ^0.7.0
firebase_messaging: ^8.0.0-dev.14
MainActivity.kt:
package com.mydomain.myproject
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}
package com.mydomain.myproject
import com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingBackgroundExecutor
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingBackgroundService
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin
import io.flutter.plugins.pathprovider.PathProviderPlugin
class MyApplication : FlutterApplication(), PluginRegistrantCallback {
override
fun onCreate() {
super.onCreate()
FlutterFirebaseMessagingBackgroundService.setPluginRegistrant(this)
FlutterFirebaseMessagingBackgroundExecutor.setPluginRegistrant(this)
}
override
fun registerWith(registry: PluginRegistry) {
PathProviderPlugin.registerWith(registry.registrarFor("io.flutter.plugins.pathprovider.PathProviderPlugin"))
FlutterLocalNotificationsPlugin.registerWith(registry.registrarFor("com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin"))
FlutterFirebaseMessagingPlugin.registerWith(registry.registrarFor("plugins.flutter.io/firebase_messaging"))
}
}
应用程序.kt:
package com.mydomain.myproject
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}
package com.mydomain.myproject
import com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingBackgroundExecutor
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingBackgroundService
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin
import io.flutter.plugins.pathprovider.PathProviderPlugin
class MyApplication : FlutterApplication(), PluginRegistrantCallback {
override
fun onCreate() {
super.onCreate()
FlutterFirebaseMessagingBackgroundService.setPluginRegistrant(this)
FlutterFirebaseMessagingBackgroundExecutor.setPluginRegistrant(this)
}
override
fun registerWith(registry: PluginRegistry) {
PathProviderPlugin.registerWith(registry.registrarFor("io.flutter.plugins.pathprovider.PathProviderPlugin"))
FlutterLocalNotificationsPlugin.registerWith(registry.registrarFor("com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin"))
FlutterFirebaseMessagingPlugin.registerWith(registry.registrarFor("plugins.flutter.io/firebase_messaging"))
}
}
使用fcm的代码:
我刚刚在主应用程序类的initState()中调用了_initFcm()。
我的目标是当应用程序在后台时,后台fcm方法必须触发,并且我必须将消息数据保存在prefrence中,以便在应用程序打开时对其进行处理
void _initFcm() {
Firebase.initializeApp();
FirebaseMessaging.onMessageOpenedApp.listen((message) {
Logger.log("_messaging onMessageOpenedApp: ${message}");
});
FirebaseMessaging.instance.getInitialMessage().then((value) {
Logger.log("_messaging getInitialMessage: ${value}");
});
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification notification = message.notification;
Map<String, dynamic> data = message.data;
Logger.log("_messaging onMessage: ${message}");
Fcm.showNotification(notification.body, notification.title);
String type = data['type'];
if (type == "view") {
String notifPath = data['subject'];
notificationProvider.addPath(notifPath);
Logger.log('new notification added to notificationList: ${notifPath}');
}
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
Logger.log("_messaging onMessageOpenedApp: $message");
});
FirebaseMessaging.onBackgroundMessage((message) {
Logger.log("_messaging onBackgroundMessage: $message");
return;
});
}
void\u initFcm(){
Firebase.initializeApp();
FirebaseMessaging.onMessageGeoPenedApp.listen((消息){
Logger.log(“_messagingonmessagegeopenedapp:${message}”);
});
FirebaseMessaging.instance.getInitialMessage().then((值){
Logger.log(“_messaginggetInitialMessage:${value}”);
});
FireBaseMessage.onMessage.listen((远程消息){
RemoteNotification通知=message.notification;
地图数据=message.data;
Logger.log(“\u messaging onMessage:${message}”);
Fcm.showNotification(notification.body,notification.title);
字符串类型=数据['type'];
如果(类型=“视图”){
字符串notifPath=data['subject'];
notificationProvider.addPath(notifPath);
Logger.log('新通知添加到notificationList:${notifPath}');
}
});
FirebaseMessaging.onMessageGeoPenedApp.listen((远程消息){
Logger.log(“_messagingonmessagegeopenedapp:$message”);
});
FirebaseMessaging.onBackgroundMessage((消息){
Logger.log(“\u messaging onBackgroundMessage:$message”);
返回;
});
}
运行日志:
[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: NoSuchMethodError: The method 'toRawHandle' was called on null.
E/flutter ( 5030): Receiver: null
E/flutter ( 5030): Tried calling: toRawHandle()
E/flutter ( 5030): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
E/flutter ( 5030): #1 MethodChannelFirebaseMessaging.registerBackgroundMessageHandler (package:firebase_messaging_platform_interface/src/method_channel/method_channel_messaging.dart:181:42)
E/flutter ( 5030): #2 FirebaseMessagingPlatform.onBackgroundMessage= (package:firebase_messaging_platform_interface/src/platform_interface/platform_interface_messaging.dart:107:14)
E/flutter ( 5030): #3 FirebaseMessaging.onBackgroundMessage (package:firebase_messaging/src/messaging.dart:103:31)
E/flutter ( 5030): #4 _ChatrAppState._initFcm (package:parsian_chatr/app/ui/chatr_app.dart:90:23)
E/flutter ( 5030): #5 _ChatrAppState.initState (package:parsian_chatr/app/ui/chatr_app.dart:69:5)
E/flutter ( 5030): #6 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4765:58)
E/flutter ( 5030): #7 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter ( 5030): #8 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter ( 5030): #9 Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter ( 5030): #10 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1252:16)
E/flutter ( 5030): #11 RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:1223:5)
E/flutter ( 5030): #12 RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:1165:17)
E/flutter ( 5030): #13 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2683:19)
E/flutter ( 5030): #14 RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:1164:13)
E/flutter ( 5030): #15 WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:974:7)
E/flutter ( 5030): #16 WidgetsBinding.scheduleAttachRootWidget.<anonymous closure> (package:flutter/src/widgets/binding.dart:955:7)
E/flutter ( 5030): #17 _rootRun (dart:async/zone.dart:1182:47)
E/flutter ( 5030): #18 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 5030): #19 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter ( 5030): #20 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
E/flutter ( 5030): #21 _rootRun (dart:async/zone.dart:1190:13)
E/flutter ( 5030): #22 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 5030): #23 _CustomZone.bindCallback.<anonymous closure> (dart:async/zone.dart:1021:23)
E/flutter ( 5030): #24 Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
E/flutter ( 5030): #25 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:397:19)
E/flutter ( 5030): #26 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:428:5)
E/flutter ( 5030): #27 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
E/flutter ( 5030):
[错误:flatter/lib/ui/ui\u dart\u state.cc(177)]未处理的异常:NoSuchMethodError:对null调用了方法“toRawHandle”。
E/颤振(5030):接收器:空
E/flatter(5030):尝试调用:toRawHandle()
E/颤振(5030):#0 Object.noSuchMethod(dart:core patch/Object_patch.dart:51:5)
E/Flatter(5030):#1 MethodChannelFirebaseMessaging.registerBackgroundMessageHandler(包:firebase_messaging_平台_interface/src/method_channel/method_channel_messaging.dart:181:42)
E/flatter(5030):#2 FirebaseMessagingPlatform.onBackgroundMessage=(包:firebase_消息传递_平台_接口/src/platform_接口/平台_接口_消息传递。dart:107:14)
E/flatter(5030):#3 FirebaseMessaging.onBackgroundMessage(包:firebase_messaging/src/messaging.dart:103:31)
电子/颤振(5030):#4(聊天室状态.)初始FCM(软件包:parsian(聊天室/应用程序/用户界面/聊天室)应用程序dart:90:23)
E/flatter(5030):#5 40; ChatrAppState.initState)(包:parsian_chatr/app/ui/chatr_app.dart:69:5)
E/flatter(5030):#6 StatefulElement._firstBuild(包:flatter/src/widgets/framework.dart:4765:58)
E/flatter(5030):#7 ComponentElement.mount(包:flatter/src/widgets/framework.dart:4601:5)
E/flatter(5030):#8 Element.inflateWidget(包:flatter/src/widgets/framework.dart:3569:14)
E/flatter(5030):#9 Element.updateChild(包:flatter/src/widgets/framework.dart:3327:18)
E/flatter(5030):#10 RenderObjectToWidgetElement._重建(包:flatter/src/widgets/binding.dart:1252:16)
E/flatter(5030):#11 RenderObjectToWidgetElement.mount(包:flatter/src/widgets/binding.dart:1223:5)
E/颤振(5030):#12渲染对象到WidgetAdapter.attachToRenderTree。(包:flatter/src/widgets/binding.dart:1165:17)
E/flatter(5030):#13 BuildOwner.buildScope(包:flatter/src/widgets/framework.dart:2683:19)
E/flatter(5030):#14 RenderObjectToWidgetAdapter.attachToRenderTree(包:flatter/src/widgets/binding.dart:1164:13)
E/flatter(5030):#15 WidgetsBinding.attachRootWidget(包:flatter/src/widgets/binding.dart:974:7)
E/颤振(5030):#16 widgetsbind.scheduleAttachRootWidget。(包:flatter/src/widgets/binding.dart:955:7)
E/flatter(5030):#17_rootRun(dart:async/zone.dart:1182:47)
E/flatter(5030):#18 _CustomZone.run(dart:async/zone.dart:1093:19)
E/flatter(5030):#19 _CustomZone.runguard(dart:async/zone.dart:997:7)
E/颤振(5030):#20_CustomZone.bindCallbackguared。(dart:async/zone.dart:1037:23)
E/flatter(5030):#21 rootRun(dart:async/zone.dart:1190:13)
E/flatter(5030):#22 _CustomZone.run(dart:async/zone.dart:1093:19)
E/颤振(5030):#23 _CustomZone.bindCallback。(dart:async/zone.dart:1021:23)
E/颤振(5030):24定时器。(dart:async patch/timer_patch.dart:18:15)
E/颤振(5030):#25 _计时器。_运行计时器(dart:isolate patch/Timer_impl.dart:397:19)
E/颤振(5030):#26 _定时器。_handleMessage(省道:隔离补丁/定时器_impl.省道:428:5)
E/颤振(5030):#27(RawReceivePortImpl.)处理消息(dart:隔离补丁/隔离补丁。dart:168:12)
E/颤振(5030):
试试这个
在包含MainApp类的文件中添加处理程序。记得把它添加到课堂之外
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
print("Handling a background message");
}
与
参考:
关于你的背景信息,有几件事需要记住
处理程序:
它不能是匿名函数。它必须是顶级函数
(例如,不是需要初始化的类方法)
在您的代码中被调用了两次您能添加一些代码吗?在
catr\U应用程序中添加代码。dart
肯定会有助于理解可能出现的问题。@dm\u tr是的,添加了代码,我编辑了问题请检查是否确实编辑了问题?升级到firebase后,我可以在我的应用程序中确认相同的问题。\ u消息:^8.0.0-dev.14
FirebaseMessaging.onMessageOpenedApp.listen((message) {
Logger.log("_messaging onMessageOpenedApp: ${message}");
});