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
相关产品推荐
相关产品推荐

