Flutter中Firebase_messaging的onResume与onLaunch回调未触发
FCM通知点击后onResume/onLaunch未触发,无法跳转指定页面的解决方案
我之前也碰到过一模一样的问题,结合firebase_messaging 6.0.9的版本特性,你可以从以下几个方向排查和修复:
1. 检查FCM消息的Payload结构
当应用处于后台或被完全杀死时,系统会接管通知的展示逻辑。如果只发送纯notification类型的消息,点击后大概率不会触发onResume/onLaunch回调,必须确保消息携带data字段并配置正确的click_action。
示例正确Payload:
{ "to": "你的设备推送令牌", "notification": { "title": "新通知提醒", "body": "点击查看详情" }, "data": { "click_action": "FLUTTER_NOTIFICATION_CLICK", "screen": "notifications" // 可选,用来区分不同跳转页面 } }
2. 配置AndroidManifest.xml的Intent Filter
需要在MainActivity标签内添加对应的intent-filter,确保系统能把通知点击事件正确传递给Flutter:
<activity android:name=".MainActivity" android:launchMode="singleTop"> <!-- 避免重复创建页面实例 --> <intent-filter> <action android:name="FLUTTER_NOTIFICATION_CLICK" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
添加android:launchMode="singleTop"是关键,它能保证点击通知时不会重新创建MainActivity,确保回调能正常触发。
3. 使用GlobalKey确保Navigator上下文有效
你当前代码里直接使用的context可能存在无效的情况(比如初始化时上下文还未完全绑定),建议用全局NavigatorKey来解决:
- 先定义全局Key:
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey<NavigatorState>(); - 在MaterialApp中配置这个Key:
MaterialApp( navigatorKey: _navigatorKey, home: YourHomeScreen(), // 其他页面配置 ) - 修改回调里的跳转代码:
onResume: (Map<String, dynamic> message) async { print('@onResume: $message'); _navigatorKey.currentState?.push( MaterialPageRoute(builder: (context) => NotificationsScreen()) ); }, onLaunch: (Map<String, dynamic> message) async { print('@onLaunch: $message'); _navigatorKey.currentState?.push( MaterialPageRoute(builder: (context) => NotificationsScreen()) ); },
4. 验证Gradle配置完整性
确保app/build.gradle的末尾已经应用了google-services插件:
apply plugin: 'com.google.gms.google-services'
你现有的firebase-messaging:20.1.0和firebase_messaging:^6.0.9版本是兼容的,这部分不用调整。
完成以上配置后,把应用退到后台或完全杀死,发送符合要求的FCM消息,点击通知应该就能触发对应的回调并成功跳转到NotificationsScreen了。
内容的提问来源于stack exchange,提问作者Haroon khan
相关产品推荐
相关产品推荐

