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

Flutter应用处于后台时通知重复显示问题

解决Firebase+flutter_local_notifications通知重复问题

问题根源

  • 后台双重触发:应用处于后台/关闭状态时,FCM会自动弹出系统通知,若你的后台消息处理逻辑中还调用了flutter_local_notifications展示通知,就会导致重复。
  • Laravel端重复发送:可能是接口被多次请求、队列任务重复执行,使得同一条通知被多次推送。
  • 通知无唯一标识:未给通知添加唯一标记,系统无法识别重复通知,进而重复展示。

实操解决步骤

1. 拆分前后台通知处理逻辑

前台用flutter_local_notifications展示通知,后台仅处理数据逻辑,交给FCM默认展示系统通知,避免重复触发:

// 前台收到消息,触发本地通知
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
  if (message.notification != null) {
    _showLocalNotification(message);
  }
});

// 后台/终止状态的消息处理,只做数据操作(如更新缓存),不要弹通知
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  // 此处仅处理业务数据逻辑,不调用通知展示方法
}

2. 给通知添加唯一标识(Laravel端)

发送FCM通知时,为每个通知设置唯一的collapse_key、安卓tag或iOSthread-id,让系统自动去重:

// Laravel通知代码示例
return FirebaseMessage::create()
    ->withNotification([
        'title' => $this->title,
        'body' => $this->body,
    ])
    ->withData(['order_id' => $this->orderId])
    ->withAndroid([
        'collapse_key' => 'order_notify_' . $this->orderId,
        'notification' => ['tag' => 'order_notify_' . $this->orderId],
    ])
    ->withApns([
        'aps' => ['thread-id' => 'order_notify_' . $this->orderId],
    ]);

3. 检查flutter_local_notifications初始化配置

保持初始化配置简洁,避免开启重复展示的冗余设置:

final AndroidInitializationSettings androidInit =
    AndroidInitializationSettings('@mipmap/ic_launcher');
final IOSInitializationSettings iosInit = IOSInitializationSettings(
  onDidReceiveLocalNotification: (id, title, body, payload) async {},
);
final initSettings = InitializationSettings(
  android: androidInit,
  iOS: iosInit,
);
await flutterLocalNotificationsPlugin.initialize(initSettings);

4. 排查Laravel端重复发送问题

查看Laravel日志记录,确认是否存在同一条通知被多次触发的情况,比如队列任务是否重复执行、前端接口是否多次调用。

内容的提问来源于stack exchange,提问作者Kamla Saad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:05:51