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
相关产品推荐
相关产品推荐

