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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 19:59:50