You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:57:01