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

如何使用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实现周期性任务:

实现步骤

  1. 在pubspec.yaml添加workmanager依赖
  2. 注册周期性工作,每隔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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:42:41