Flutter应用后台重复收到通知的解决方案咨询
解决Firebase + Local Notification后台重复通知问题
1. 核心问题定位
后台收到两条重复通知,是因为Firebase在应用后台时会自动展示带notification字段的推送消息,而你的代码没做应用状态判断,后台时依然触发了Local Notification,导致重复弹窗。
2. 仅前台触发Local Notification
修改消息监听逻辑,只在应用处于前台活跃状态时才弹出本地通知:
FirebaseMessaging.onMessage.listen((RemoteMessage message) async { // 获取当前应用生命周期状态 final appState = WidgetsBinding.instance.lifecycleState; // 只有前台活跃时才触发本地通知 if (appState == AppLifecycleState.resumed) { _showLocalNotification(message); // 你原有本地通知展示方法 } });
3. 基于Payload实现通知跳转
分两种场景处理跳转逻辑:
(1)应用后台活跃(未被杀死)
监听通知点击事件,直接路由跳转:
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { // 从payload的data字段提取路由参数,比如你传的"route": "/order-detail" final targetRoute = message.data['route']; if (targetRoute != null) { Navigator.pushNamed(context, targetRoute); } });
(2)应用完全被杀死
在initState中检查启动时的初始消息,完成页面初始化后跳转:
@override void initState() { super.initState(); // 检查应用是否由通知点击启动 FirebaseMessaging.instance.getInitialMessage().then((message) { if (message != null) { final targetRoute = message.data['route']; if (targetRoute != null) { WidgetsBinding.instance.addPostFrameCallback((_) { Navigator.pushNamed(context, targetRoute); }); } } }); }
4. AndroidManifest配置检查
确保清单文件中没有重复配置通知服务,保留Firebase默认服务即可:
<!-- 不要额外添加会触发本地通知的自定义服务 --> <service android:name="com.google.firebase.messaging.FirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
如果自定义了FirebaseMessagingService子类,不要在onMessageReceived的后台分支中触发本地通知,交给Firebase自动展示即可。
关键提醒
- 推送时优先使用「通知消息+data字段」的格式:后台时Firebase自动展示通知,data字段携带跳转参数;纯数据消息需要自行处理展示,不符合你要保留Firebase通知的需求。
- 不要在
FirebaseMessaging.onBackgroundMessage回调中触发本地通知,这个回调是后台数据处理逻辑,Firebase已经会展示通知,重复触发会导致双通知。
内容的提问来源于stack exchange,提问作者Arnab Ghosh
相关产品推荐
相关产品推荐

