如何在Flutter中实现点击按钮1小时后触发本地通知?
Flutter 延迟1小时触发本地通知实现方案
你使用的flutter_local_notifications: ^8.2.0版本完全支持该需求,核心通过插件的延迟调度通知能力实现,具体实现步骤如下:
前置准备
- 在
pubspec.yaml中添加所需依赖:
dependencies: flutter_local_notifications: ^8.2.0 timezone: ^0.9.0
- 完成插件平台侧基础配置:
- 安卓端配置通知渠道、申请通知权限
- iOS端开启通知相关Capability、申请通知推送权限
核心实现逻辑
- 初始化插件与时区配置(建议放在应用启动阶段或页面初始化阶段执行):
// 导入依赖包 import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:timezone/data/latest_all.dart' as tz; import 'package:timezone/timezone.dart' as tz; // 全局初始化通知插件实例 final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); Future<void> initNotification() async { // 初始化时区数据,保证时间计算适配系统本地时区 tz.initializeTimeZones(); // 安卓端初始化配置,参数替换为你自己的应用图标资源名 const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher'); // iOS端初始化配置 const IOSInitializationSettings initializationSettingsIOS = IOSInitializationSettings(); const InitializationSettings initializationSettings = InitializationSettings( android: initializationSettingsAndroid, iOS: initializationSettingsIOS, ); await flutterLocalNotificationsPlugin.initialize(initializationSettings); }
- 按钮点击事件中添加1小时延迟通知调度逻辑:
Future<void> scheduleOneHourDelayedNotification() async { // 计算当前时间加1小时的触发时间点 final triggerTime = tz.TZDateTime.now(tz.local).add(const Duration(hours: 1)); // 安卓通知配置,channelId需和你预先创建的通知渠道ID一致 const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails( 'delayed_notify_channel', '延迟通知渠道', channelDescription: '用于发送1小时后触发的延迟通知', importance: Importance.max, priority: Priority.high, ); const IOSNotificationDetails iosNotificationDetails = IOSNotificationDetails(); const NotificationDetails notificationDetails = NotificationDetails( android: androidNotificationDetails, iOS: iosNotificationDetails, ); // 提交延迟通知调度任务 await flutterLocalNotificationsPlugin.zonedSchedule( 1001, // 通知唯一ID,后续取消通知时需传入该ID '通知标题', // 替换为实际需要展示的通知标题 '1小时到了,请注意查看', // 替换为实际需要展示的通知内容 triggerTime, notificationDetails, androidAllowWhileIdle: true, // 安卓低电量空闲模式下也允许触发通知 uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, ); }
注意事项
- 每个调度的通知需要使用唯一ID,若需要取消未触发的延迟通知,调用
flutterLocalNotificationsPlugin.cancel(1001)传入对应通知ID即可 - 安卓13及以上系统需要动态申请
POST_NOTIFICATIONS权限,否则通知无法正常展示 - 若应用被用户手动强制杀死,部分定制安卓系统会禁止后台任务触发,属于系统权限限制,和插件逻辑无关
内容的提问来源于stack exchange,提问作者Alan Bosco
相关产品推荐
相关产品推荐

