firebase_messaging ^8.0.0及以上版本后台点击通知无法跳转问题求助
问题修复方案
核心错误原因
- 回调函数嵌套错误:当前事件监听的回调中额外嵌套了一层未执行的函数,导致点击通知后的业务逻辑完全没有触发
- RemoteMessage结构适配错误:
getRideRequestId方法入参要求为Map类型,但实际传入的是firebase_messaging 8.0+版本新增的RemoteMessage对象,参数类型不匹配导致逻辑报错 - 安卓通知配置缺失(日志警告项,会影响通知展示稳定性)
修复步骤
1. 修正事件回调逻辑
去掉所有事件监听中多余的嵌套函数,直接处理收到的RemoteMessage参数
2. 适配RemoteMessage数据结构
修改getRideRequestId方法,直接从RemoteMessage的data字段取值,8.0+版本已统一安卓、iOS的数据结构,无需额外分平台判断
3. 补充安卓通知通道配置(可选但推荐)
安卓8.0及以上系统要求通知必须绑定有效通道才能正常展示,需在通知展示前创建对应通道,也可在AndroidManifest.xml中声明后在Dart层初始化
修正后完整代码
class PushNotificationService { final FirebaseMessaging messaging = FirebaseMessaging.instance; Future initialize(context) async{ // 处理应用完全关闭时点击通知启动的场景 RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); if (initialMessage != null) { retrieveRideRequestInfo(getRideRequestId(initialMessage), context); } // 处理应用在前台时收到通知的场景 FirebaseMessaging.onMessage.listen((RemoteMessage message) { retrieveRideRequestInfo(getRideRequestId(message), context); }); // 处理应用在后台运行时点击通知唤起的场景 FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { retrieveRideRequestInfo(getRideRequestId(message), context); }); // 补充注册后台消息处理器,解决日志警告(如果不需要后台处理消息逻辑可忽略) FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); } // 后台消息处理器必须是顶层/静态函数 static Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { // 有后台处理逻辑可在此补充,空实现也可消除对应日志警告 } Future<String> getToken() async{ String? token = await messaging.getToken(); if (token != null) { print("This is token :: $token"); driversRef.child(currentfirebaseUser.uid).child("token").set(token); messaging.subscribeToTopic("alldrivers"); messaging.subscribeToTopic("allusers"); } return token ?? ""; } String getRideRequestId(RemoteMessage message){ String rideRequestId = ""; // 8.0+版本已统一安卓iOS的data结构,直接从message.data取值即可 rideRequestId = message.data['ride_request_id'] ?? ""; return rideRequestId; } void retrieveRideRequestInfo(String rideRequestId, BuildContext context){ newRequestsRef.child(rideRequestId).once().then((DataSnapshot dataSnapshot) { if (dataSnapshot.value != null) { double pickUpLocationLat = double.parse( dataSnapshot.value['pickup']['latitude'].toString()); double pickUpLocationLng = double.parse( dataSnapshot.value['pickup']['longitude'].toString()); String pickUpAddress = dataSnapshot.value['pickup_address'].toString(); // 若原逻辑遗漏页面跳转代码,需在此处补充跳转逻辑 // Navigator.push(context, MaterialPageRoute(builder: (context) => 目标页面)); } }); } }
额外注意事项
如果推送通知由服务端发送,需要确保 payload 的data字段中包含ride_request_id参数,否则无法正确获取请求ID跳转对应页面。
内容的提问来源于stack exchange,提问作者ahmed
相关产品推荐
相关产品推荐

