FirebaseMessaging类未定义configure方法 求正确Flutter推送实现代码
报错原因
configure()方法在firebase_messaging v8.0.0及以上版本已被正式移除,新版SDK采用独立Stream接口分别处理不同生命周期下的推送消息事件
修正后完整代码
import 'dart:io' show Platform; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; class PushNotificationService { final firebaseMessaging = FirebaseMessaging.instance; Future initialize(context) async { // 请求通知权限(iOS必选,Android可按需配置) NotificationSettings settings = await firebaseMessaging.requestPermission( alert: true, badge: true, sound: true, ); if (settings.authorizationStatus == AuthorizationStatus.authorized) { // 对应旧版onMessage:处理APP前台运行时收到推送的场景 FirebaseMessaging.onMessage.listen((RemoteMessage message) { // 转为Map兼容原有逻辑,也可直接通过message.data取值 Map<String, dynamic> messageMap = { 'notification': { 'title': message.notification?.title, 'body': message.notification?.body, }, 'data': message.data, }; retrieveRideRequestInfo(getRideRequestId(messageMap), context); }); // 对应旧版onResume:处理APP后台挂起时,点击通知进入的场景 FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { Map<String, dynamic> messageMap = { 'notification': { 'title': message.notification?.title, 'body': message.notification?.body, }, 'data': message.data, }; retrieveRideRequestInfo(getRideRequestId(messageMap), context); }); // 对应旧版onLaunch:处理APP完全终止时,点击通知启动APP的场景 RemoteMessage? initialMessage = await firebaseMessaging.getInitialMessage(); if (initialMessage != null) { Map<String, dynamic> messageMap = { 'notification': { 'title': initialMessage.notification?.title, 'body': initialMessage.notification?.body, }, 'data': initialMessage.data, }; retrieveRideRequestInfo(getRideRequestId(messageMap), context); } } } // 原有业务方法无需修改 String getRideRequestId(Map<String, dynamic> message) { // 原有逻辑保留 } void retrieveRideRequestInfo(String rideId, dynamic context) { // 原有逻辑保留 } }
注意事项
- 调用
initialize方法前必须先完成Firebase全局初始化,需在main函数中执行await Firebase.initializeApp(); - 如需处理后台静默推送,额外实现
FirebaseMessaging.onBackgroundMessage顶层回调即可 - 若原有
getRideRequestId方法可直接适配RemoteMessage类型,可省略转Map的步骤,直接传message对象调用
内容的提问来源于stack exchange,提问作者Michelangelo
相关产品推荐
相关产品推荐

