如何使用flutter_local_notifications实现每4小时重复推送本地通知?
实现flutter_local_notifications每4小时推送本地通知的方案
可以实现,虽然flutter_local_notifications的periodicallyShow方法仅支持固定的4种重复间隔,但通过循环调度通知或结合平台原生能力,就能实现精确的每4小时推送需求,以下是具体方案:
方案1:跨平台通用循环调度
核心思路是:通过schedule方法手动指定下一次通知的触发时间(当前时间+4小时),并在通知触发/被点击时,再次调度下一次通知,形成循环。
实现代码
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); // 初始化通知插件 Future<void> initNotifications() async { const AndroidInitializationSettings androidInitSettings = AndroidInitializationSettings('@mipmap/ic_launcher'); const InitializationSettings initSettings = InitializationSettings(android: androidInitSettings); await flutterLocalNotificationsPlugin.initialize(initSettings, onDidReceiveNotificationResponse: (NotificationResponse response) { // 通知触发或被点击后,立即调度下一次 _schedule4HourlyNotification(); }); } // 调度下一次4小时通知 Future<void> _schedule4HourlyNotification() async { const AndroidNotificationDetails androidDetails = AndroidNotificationDetails( '4hourly_notif_channel', '4小时重复通知', channelDescription: '每4小时推送一次的本地通知', importance: Importance.high, priority: Priority.high, ); const NotificationDetails notificationDetails = NotificationDetails(android: androidDetails); // 计算下一个触发时间:当前时间 + 4小时 DateTime nextTriggerTime = DateTime.now().add(const Duration(hours: 4)); // 使用固定ID覆盖旧调度,避免重复任务 await flutterLocalNotificationsPlugin.schedule( 100, '4小时提醒', '距离上次通知已经过去4小时了', nextTriggerTime, notificationDetails, androidAllowWhileIdle: true, // 低电量模式下仍可触发 androidScheduleMode: AndroidScheduleMode.exact, // 确保精确触发 ); } // 启动首次通知调度 void start4HourlyNotifications() { _schedule4HourlyNotification(); }
方案2:Android平台后台增强(稳定触发)
如果需要应用被后台杀死后仍能稳定触发通知,可以结合Android的WorkManager实现周期性任务:
实现步骤
- 在
pubspec.yaml添加workmanager依赖 - 注册周期性工作,每隔4小时执行一次并显示通知
代码示例
import 'package:workmanager/workmanager.dart'; // 初始化WorkManager void initWorkManager() { Workmanager().initialize( callbackDispatcher, isInDebugMode: false, ); // 注册每4小时执行的周期性任务 Workmanager().registerPeriodicTask( '4hourly_notif_task', 'showNotification', frequency: const Duration(hours: 4), initialDelay: const Duration(hours: 4), constraints: Constraints( networkType: NetworkType.not_required, requiresBatteryNotLow: false, ), ); } // 任务回调:显示通知 void callbackDispatcher() { Workmanager().executeTask((task, inputData) async { await _showNotification(); return Future.value(true); }); } // 显示通知的方法 Future<void> _showNotification() async { const AndroidNotificationDetails androidDetails = AndroidNotificationDetails( '4hourly_notif_channel', '4小时重复通知', channelDescription: '每4小时推送一次的本地通知', importance: Importance.high, priority: Priority.high, ); const NotificationDetails notificationDetails = NotificationDetails(android: androidDetails); await flutterLocalNotificationsPlugin.show( 100, '4小时提醒', '距离上次通知已经过去4小时了', notificationDetails, ); }
注意事项
- iOS平台:受系统后台限制,应用完全关闭后循环调度的通知可能无法触发,可尝试使用
UNCalendarNotificationTrigger结合日期组件实现,但仍受系统策略约束。 - Android渠道:Android 8.0+必须创建通知渠道,上述代码已包含渠道配置。
- 精确性:Android上
AndroidScheduleMode.exact确保通知准时触发,但会增加少量电量消耗,可根据需求调整为inexact。
内容的提问来源于stack exchange,提问作者Melom
相关产品推荐
相关产品推荐

