Flutter使用firebase_messaging时terminated状态下getInitialMessage返回null
问题根因与修复方案
你遇到的getInitialMessage()返回null是多个常见配置和代码逻辑问题共同导致的,按以下步骤修复即可:
1. 修正getInitialMessage()的调用逻辑
你当前的代码存在两个错误:
- 没有对返回的
initialMessage做空判断,为空时直接调用方法会触发异常 - 错误将
RemoteMessage对象直接toString()后转JSON,RemoteMessage的toString()返回值不是标准JSON格式,会导致解析失败
修正后的代码如下:
FirebaseMessaging.instance .getInitialMessage() .then((RemoteMessage? initialMessage) async { log("message : $initialMessage", name: "getInitialMessage"); // 先判空,再直接取data字段即可,不需要手动转JSON if (initialMessage != null) { handleNotificationClick(context, initialMessage.data); } });
2. 修正FCM通知 payload 格式与安卓配置
应用终止状态下的通知由系统FCM服务处理,必须满足以下要求才能正确触发初始消息回调:
- 推送的消息必须同时包含
notification(通知内容)和data(自定义参数)两个字段 - 安卓端推送配置中必须指定
click_action为FLUTTER_NOTIFICATION_CLICK - 需在
android/app/src/main/AndroidManifest.xml的MainActivity标签内添加对应intent-filter:
<intent-filter> <action android:name="FLUTTER_NOTIFICATION_CLICK" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
标准服务端推送payload参考:
{ "notification": { "title": "通知标题", "body": "通知内容" }, "data": { "跳转类型": "详情页", "参数id": "123456" }, "android": { "notification": { "click_action": "FLUTTER_NOTIFICATION_CLICK" } }, "token": "目标设备的FCM token" }
3. 修正初始化逻辑冲突
你的代码中存在重复初始化逻辑:checkFirebase()和_initializeServices()两个方法都做了Firebase相关初始化,且flutter_local_notifications_plugin的初始化逻辑混乱。
- 保留一处统一的Firebase初始化入口即可,不要重复初始化
- 终止状态下收到的通知由系统FCM服务弹出,不需要在
_firebaseMessagingBackgroundHandler中用本地通知插件重复弹出通知,避免两个通知冲突导致点击时丢失参数
4. 版本兼容与测试注意事项
firebase_messaging: ^10.0.4对应的安卓端google-services插件版本需升级到4.3.10及以上,在android/build.gradle中配置即可- 测试时需完全杀死应用进程后再触发推送,不要使用Flutter的热重载/热重启功能,热重启会清空应用进程的临时缓存,导致
getInitialMessage()返回null
内容的提问来源于stack exchange,提问作者Padfoot
相关产品推荐
相关产品推荐

