代码行:
messaging.configure(onMessage: (Map<String, dynamic> message){}
DART分析错误
error: The method 'configure' isn't defined for the type 'FirebaseMessaging'.
messaging.configure(onMessage: (Map<String, dynamic> message){}
DART分析错误
error: The method 'configure' isn't defined for the type 'FirebaseMessaging'.
FirebaseMessaging.configure() 已被 Firebase 团队删除:根据 https://firebase.flutter.dev/docs/migration/#messaging —
原因:如果多次调用 configure()(无论是为了注册不同的处理程序还是删除处理程序),先前的实现会导致意外副作用。此更改允许开发人员更明确地注册处理程序并删除它们,而不通过 Streams 影响其他人。
使用 FirebaseMessaging.onMessage
方法来获取消息。
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification notification = message.notification;
AndroidNotification android = message.notification?.android;
});
FirebaseMessaging.onMessageOpenedApp
作为onLaunch
和onResume
处理程序的替代方法。FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('A new onMessageOpenedApp event was published!');
Navigator.pushNamed(context, '/message',
arguments: MessageArguments(message, true));
});
请查看以下示例。
@override
void initState() {
super.initState();
FirebaseMessaging.instance
.getInitialMessage()
.then((RemoteMessage message) {
if (message != null) {
Navigator.pushNamed(context, '/message',
arguments: MessageArguments(message, true));
}
});
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification notification = message.notification;
AndroidNotification android = message.notification?.android;
if (notification != null && android != null) {
flutterLocalNotificationsPlugin.show(
notification.hashCode,
notification.title,
notification.body,
NotificationDetails(
android: AndroidNotificationDetails(
channel.id,
channel.name,
channel.description,
// TODO add a proper drawable resource to android, for now using
// one that already exists in example app.
icon: 'launch_background',
),
));
}
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('A new onMessageOpenedApp event was published!');
Navigator.pushNamed(context, '/message',
arguments: MessageArguments(message, true));
});
}
在Jitesh的答案基础上,我认为需要实现getInitialMessage
来使得当应用被终止时导航能够正常工作(替代onLaunch)。
// workaround for onLaunch: When the app is completely closed (not in the background) and opened directly from the push notification
FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage message) {
print('getInitialMessage data: ${message.data}');
_serialiseAndNavigate(message);
});
// onMessage: When the app is open and it receives a push notification
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print("onMessage data: ${message.data}");
});
// replacement for onResume: When the app is in the background and opened directly from the push notification.
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('onMessageOpenedApp data: ${message.data}');
_serialiseAndNavigate(message);
});
message.data
后,它会给我一个空的映射表,我不知道为什么。 - Samuel经过一些测试,这是我的结论:
FirebaseMessaging.onMessageOpenedApp.listen((message)){} == "OLD" onResume() 只有在应用程序启动和/或在后台且通知被点击时才会激活
FirebaseMessaging.instance.getInitialMessage() == "OLD" onLaunch() 仅在应用程序被杀死且通知被点击时有效!
更新一:
FirebaseMessagingService 在应用程序开始时非常重要。为此,您需要遵循以下步骤: 首先声明此函数:
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
debugPrint("Firebase Messaging firebase is initialized");
await Firebase.initializeApp();
}
然后在应用程序的main(){}中调用此函数:
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
然后您就可以使用这些函数:
FirebaseMessaging.onMessage 方法来获取消息
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification notification = message.notification;
AndroidNotification android = message.notification?.android;
});
FirebaseMessaging.onMessageOpenedApp作为onLaunch和onResume处理程序的替代方案。
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('A new onMessageOpenedApp event was published!');
Navigator.pushNamed(context, '/message',
arguments: MessageArguments(message, true));
});
事件处理:
事件处理已经重新设计,为开发者提供了更直观的API。基于前台的事件现在可以通过流进行访问:
FirebaseMessaging.onMessage返回一个流对象,当Flutter实例处于前台时接收到FCM有效负载时被调用,其中包含一个[RemoteMessage]。
FirebaseMessaging.onMessageOpenedApp返回一个[Stream]对象,在用户通过FCM显示的通知按下时被调用。这替代了之前的onLaunch和onResume处理程序。
FirebaseMessaging.onBackgroundMessage()设置后台消息处理程序,以在应用程序在后台或终止时触发。IosNotificationSettings:
是的,我做了所有那些 ^^ 而且一切都正常,除了在应用程序被终止时点击通知后的重定向。 我确保当应用程序被终止时,onMessageOpenedApp.listen() 不起作用。
证据是,我有一个屏幕,记录所有收到的通知以及在应用程序被终止时接收到的通知:
当应用程序被终止时,点击通知时无法触发 onMessageOpenedApp(就像 onLaunch() / onResume() 之前有效一样...)。
这就是为什么我问如何在新版本的 Firebase 中实现这一点的原因?
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('A new onMessageOpenedApp event was published!');
Navigator.pushNamed(context, '/message',
arguments: MessageArguments(message, true));
});
firebase_messaging ^8.0.0-dev.10
可以从 FlutterFire 的链接 https://firebase.flutter.dev/docs/migration/ 获取。 - user14707939