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

Firebase Cloud Messaging通知无法堆叠,新通知覆盖旧通知求助

FCM通知被覆盖问题的解决方案

你遇到的问题核心是通知tag未真正实现唯一性,或是系统自动处理notification payload时的逻辑限制。以下是具体排查和解决方法:

1. 确保Tag绝对唯一

先验证createTag(3)生成的字符串是否每次都不同。如果生成逻辑存在重复风险(比如固定长度随机字符串有碰撞概率),改用更可靠的唯一标识:

  • 使用时间戳:DateTime.now().millisecondsSinceEpoch.toString()
  • 使用UUID:通过uuid包生成(需先在pubspec.yaml添加依赖)

修改后的代码示例:

// 生成绝对唯一的tag
String uniqueTag = DateTime.now().millisecondsSinceEpoch.toString();

final data = {
  'click_action': 'FLUTTER_NOTIFICATION_CLICK',
  'status': 'done',
  'message': title,
  'body' : body,
};

try{
  http.Response response = await http.post(Uri.parse('https://fcm.googleapis.com/fcm/send'), headers: <String, String>{
    'Content-Type': 'application/json',
    'Authorization': 'key=MY_CODE'
  },
      body: jsonEncode(<String, dynamic>{
        'notification': <String, dynamic> {
          'title': title, 
          'body': body, 
          'android_channel_id':'dbfood',
          "tag" : uniqueTag // 替换为唯一tag
        },
        'priority': 'high',
        'data': data,
        'to': token
      })
  );

  if(response.statusCode != 200){
    print("Error");
  }
}catch(e){
  print(e.toString());
}

2. 改用Data消息+手动展示通知

FCM的notification payload由系统自动展示,部分场景下可能忽略tag逻辑。改用data消息并在Flutter端手动触发通知,可完全控制通知展示行为:

发送端修改(仅传data字段)

String uniqueTag = DateTime.now().millisecondsSinceEpoch.toString();

final data = {
  'click_action': 'FLUTTER_NOTIFICATION_CLICK',
  'status': 'done',
  'message': title,
  'body' : body,
  'title': title, // 将标题、内容放入data
  'tag': uniqueTag // 携带唯一tag
};

try{
  http.Response response = await http.post(Uri.parse('https://fcm.googleapis.com/fcm/send'), headers: <String, String>{
    'Content-Type': 'application/json',
    'Authorization': 'key=MY_CODE'
  },
      body: jsonEncode(<String, dynamic>{
        'priority': 'high',
        'data': data,
        'to': token
      })
  );

  if(response.statusCode != 200){
    print("Error");
  }
}catch(e){
  print(e.toString());
}

Flutter端手动展示通知

依赖flutter_local_notifications插件,在消息监听中处理展示:

// 初始化flutter_local_notifications
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

// 监听前台消息
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
  String title = message.data['title'];
  String body = message.data['body'];
  String tag = message.data['tag'];

  // 手动展示通知,设置唯一id和tag
  flutterLocalNotificationsPlugin.show(
    int.parse(tag), // 用tag转成唯一id,避免覆盖
    title,
    body,
    NotificationDetails(
      android: AndroidNotificationDetails(
        'dbfood',
        '通知渠道名称',
        channelDescription: '通知渠道描述',
        importance: Importance.high,
        priority: Priority.high,
        tag: tag, // 绑定tag
      ),
    ),
  );
});

3. 检查Android系统设置

确保应用的通知未被设置为合并通知:

  • 打开手机设置 → 应用 → 你的应用 → 通知
  • 找到对应通知渠道(dbfood),关闭“合并通知”选项

内容的提问来源于stack exchange,提问作者Nikko Capiroso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:01:21