如何为Flutter本地通知添加Snooze按钮及跳转选时功能?
实现Flutter通知的Snooze功能及原生Snooze按钮识别方案
一、用flutter_local_notifications添加自定义Snooze按钮并跳转首页选延迟时间
1. 配置通知Action按钮
在初始化通知时,为通知添加带唯一标识的Snooze按钮,后续通过这个标识判断按钮点击事件:
final AndroidNotificationDetails androidDetails = AndroidNotificationDetails( 'your_channel_id', 'your_channel_name', channelDescription: 'your_channel_desc', actions: <AndroidNotificationAction>[ AndroidNotificationAction( 'snooze_action', // 唯一标识Snooze按钮的actionId 'Snooze', showsUserInterface: true, // 点击后唤起APP界面 cancelNotification: true, // 点击后取消当前通知 ), ], ); final NotificationDetails notificationDetails = NotificationDetails(android: androidDetails); // 发送带Snooze按钮的通知 await flutterLocalNotificationsPlugin.show( 0, '待办提醒', '请处理今日任务', notificationDetails, );
2. 处理Snooze按钮的点击回调
注册通知回调,检测到是snooze_action触发时,直接跳转至APP首页:
// 初始化通知插件时注册回调 flutterLocalNotificationsPlugin.initialize( InitializationSettings( android: AndroidInitializationSettings('@mipmap/ic_launcher'), iOS: DarwinInitializationSettings(), ), onDidReceiveNotificationResponse: (NotificationResponse response) async { if (response.actionId == 'snooze_action') { // 跳转首页,这里用原生Navigator示例,可替换为你的路由管理方式 Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => HomePage()), (route) => false, ); } }, );
3. 首页添加延迟时间选择逻辑
在首页添加UI组件(如下拉选择框、按钮组)让用户选择延迟时长,确认后重新安排通知:
// 示例:根据用户选择的时长重新调度通知 void rescheduleNotification(int delayMinutes) { final scheduledTime = DateTime.now().add(Duration(minutes: delayMinutes)); await flutterLocalNotificationsPlugin.zonedSchedule( 0, '待办提醒', '请处理今日任务', tz.TZDateTime.from(scheduledTime, tz.local), NotificationDetails(android: androidDetails), androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, ); }
二、识别设备原生的Snooze按钮
不同平台的原生Snooze机制差异极大,目前没有通用的Flutter层方案直接识别:
Android:部分定制ROM(如三星、小米)会在通知栏自带Snooze按钮,这类操作属于系统层面处理,flutter_local_notifications没有提供直接回调接口。若要监听,需开发原生Android插件,通过
NotificationListenerService监听系统通知广播,但需要用户授权通知访问权限,且不同ROM的实现逻辑可能不一致。iOS:iOS的通知Snooze是用户左滑通知后选择“稍后提醒”,系统会自动在指定时间重推通知,但不会向APP发送回调告知这是Snooze触发的,无法直接区分首次通知与Snooze后的通知。
总结:如果需要精准控制Snooze行为,优先使用自定义Snooze按钮方案;原生系统的Snooze按钮很难在Flutter层面直接识别和处理。
内容的提问来源于stack exchange,提问作者Deva
相关产品推荐
相关产品推荐

