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

Flutter及Firebase Messaging插件更新后原有代码失效原因咨询

问题:Flutter升级后Firebase Messaging旧代码失效,求排查变更点

我在应用中使用Firebase Messaging已有数年时间,近期决定对应用进行更新,同步升级了Flutter及相关插件版本后,原有Firebase Messaging代码突然停止工作。我查阅了官方文档,但未找到代码失效的具体原因。以下是我当前使用的代码,请问新版本中哪些变更导致了代码无法正常运行?

@override
void initState() {
  super.initState();
  _firebaseMessaging.configure(
    onMessage: (Map<String, dynamic> message) async {
      print("onMessage: $message");
    },
    onLaunch: (Map<String, dynamic> message) async {
      print("onLaunch: $message");
    },
    onResume: (Map<String, dynamic> message) async {
      print("onResume: $message");
    },
  );
  _firebaseMessaging.requestNotificationPermissions(
    const IosNotificationSettings(sound: true, badge: true, alert: true));
  _firebaseMessaging.onIosSettingsRegistered
      .listen((IosNotificationSettings settings) {
    print("Settings registered: $settings");
  });
  _firebaseMessaging.getToken().then((String token) {
    assert(token != null);
    setState(() {
      _homeScreenText = "Push Messaging token: $token";
    });
    print(_homeScreenText);
  });
}

回答

嗨,这问题我太熟了——你遇到的是Firebase Messaging Flutter插件v9.0.0+版本带来的破坏性API变更,旧版本的核心API几乎全被重构了,我来给你逐个拆解代码里的问题:

1. configure() 方法被彻底移除

旧版本里用configure()统一注册onMessage/onLaunch/onResume回调的方式已经被淘汰,新版本换成了**基于流(Stream)**的监听模式:

  • 前台收到消息:现在用FirebaseMessaging.onMessage.listen()替代旧的onMessage
  • 从通知点击打开应用(覆盖旧的onLaunch和onResume):用FirebaseMessaging.onMessageOpenedApp.listen()
  • 应用完全关闭时点击通知启动:需要单独调用FirebaseMessaging.instance.getInitialMessage()获取初始消息

2. iOS权限请求API完全重构

  • 旧的requestNotificationPermissions()和IosNotificationSettings类被移除,换成了更简洁的requestPermission()方法,直接传入命名参数即可
  • 旧的onIosSettingsRegistered监听流也没了,现在权限请求会直接返回NotificationSettings对象,不需要再单独监听

3. getToken() 细节变更

虽然方法名保留,但新版本返回的是Future<String?>(可能为null),而且推荐你配合onTokenRefresh流监听token更新——毕竟token不是一成不变的,旧代码只在初始化时获取一次的逻辑也存在隐患。

适配新版本的代码示例

给你一个调整后的模板,你可以直接参考修改:

import 'package:firebase_messaging/firebase_messaging.dart';

@override
void initState() {
  super.initState();
  _initFirebaseMessaging();
}

void _initFirebaseMessaging() async {
  final FirebaseMessaging messaging = FirebaseMessaging.instance;

  // 请求iOS通知权限
  NotificationSettings settings = await messaging.requestPermission(
    alert: true,
    badge: true,
    sound: true,
  );
  print("Settings registered: ${settings.authorizationStatus}");

  // 监听前台收到的消息
  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    print("onMessage: ${message.data}");
    // 注意:新版本前台不会自动弹出系统通知,需要配合flutter_local_notifications插件实现
  });

  // 监听从通知点击打开应用的场景(覆盖旧onLaunch/onResume)
  FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
    print("onMessageOpenedApp: ${message.data}");
    // 这里可以处理跳转对应页面的逻辑
  });

  // 获取应用冷启动时的初始消息
  RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage();
  if (initialMessage != null) {
    print("initialMessage: ${initialMessage.data}");
  }

  // 获取设备推送token
  String? token = await messaging.getToken();
  setState(() {
    _homeScreenText = "Push Messaging token: ${token ?? '获取失败'}";
  });
  print(_homeScreenText);

  // 监听token刷新
  messaging.onTokenRefresh.listen((newToken) {
    print("Token refreshed: $newToken");
    setState(() {
      _homeScreenText = "Push Messaging token: $newToken";
    });
  });
}

额外提一句:如果需要在前台弹出系统通知,得配合flutter_local_notifications插件来实现,新版本Firebase Messaging不再默认处理这个场景了。

内容的提问来源于stack exchange,提问作者mzeki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:47:51