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

