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

Flutter中点击Android通知后如何自动清除该通知?

解决FCM通知点击后不消失的问题

要实现点击通知后自动从系统通知栏移除,分两种场景处理:


1. 自定义构建的通知(后台消息自行展示)

如果是在_firebaseMessagingBackgroundHandler里手动构建并展示通知,只需在创建AndroidNotificationDetails时设置autoCancel: true,点击后通知会自动消失:

@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  debugPrint('Got a message whilst in the background!');
  debugPrint("Handling a background message: ${message.messageId}");
  
  FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  // 关键配置:autoCancel: true
  const AndroidNotificationDetails androidDetails = AndroidNotificationDetails(
    'push_channel',
    '推送通知',
    channelDescription: '接收FCM推送通知',
    autoCancel: true,
  );
  const NotificationDetails notificationDetails = NotificationDetails(android: androidDetails);
  
  await flutterLocalNotificationsPlugin.show(
    message.notification.hashCode,
    message.notification?.title,
    message.notification?.body,
    notificationDetails,
    payload: message.data.toString(),
  );
}

2. 系统自动展示的FCM通知

如果是FCM后台消息由系统直接展示的通知,需要在应用被通知启动后手动清除:

步骤1:添加flutter_local_notifications依赖

在pubspec.yaml中添加:

dependencies:
  flutter_local_notifications: ^latest_version

步骤2:初始化插件并监听通知点击

修改PushMessagingController的初始化逻辑,添加通知点击后的清除操作:

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

class PushMessagingController {
  static final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin();

  static Future<void> initialise() async {
    FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

    // 初始化本地通知插件
    const AndroidInitializationSettings androidInit = AndroidInitializationSettings('@mipmap/ic_launcher');
    const InitializationSettings initSettings = InitializationSettings(android: androidInit);
    await _notificationsPlugin.initialize(
      initSettings,
      onSelectNotification: (String? payload) async {
        // 点击通知后清除所有通知(或指定id)
        await _notificationsPlugin.cancelAll();
        // 处理你的业务逻辑
      },
    );

    // 监听后台点击通知启动应用的情况
    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
      // 根据通知id清除对应通知
      _notificationsPlugin.cancel(message.notification.hashCode);
      // 或者清除所有通知:_notificationsPlugin.cancelAll();
    });

    // 其他FCM初始化代码...
  }
}

步骤3:处理冷启动场景

如果应用是完全关闭状态,点击通知冷启动,需要在main函数里处理:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  await PushMessagingController.initialise();

  // 获取冷启动时的初始化通知
  RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage();
  if (initialMessage != null) {
    // 清除对应的通知
    await PushMessagingController._notificationsPlugin.cancel(initialMessage.notification.hashCode);
    // 处理业务逻辑
  }

  runApp(const MyApp());
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:05:54