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

如何在Flutter中创建每周重复通知?(已解决)

在Flutter中使用flutter_local_notifications创建重复通知

要实现重复通知(比如每周固定日期时间的提醒),可以借助flutter_local_notifications包结合timezone包处理时区与调度逻辑,以下是具体实现方案:

1. 依赖准备

先在pubspec.yaml中添加所需依赖:

dependencies:
  flutter_local_notifications: ^最新版本号
  timezone: ^最新版本号

2. 初始化时区与通知插件

在应用启动时完成时区初始化,并创建通知插件实例:

import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:timezone/timezone.dart' as tz;

void main() async {
  // 初始化时区配置
  await tz.initializeTimeZones();
  runApp(const MyApp());
}

// 声明全局或类内的通知插件实例
late FlutterLocalNotificationsPlugin localNotificationPlg;

// 在合适的时机(如页面initState)初始化插件
void initNotificationPlugin() {
  const AndroidInitializationSettings androidInit = AndroidInitializationSettings('@mipmap/ic_launcher');
  const InitializationSettings initSettings = InitializationSettings(android: androidInit);
  
  localNotificationPlg = FlutterLocalNotificationsPlugin();
  localNotificationPlg.initialize(initSettings);
}

3. 调度重复通知

以下代码实现每周指定日期的重复提醒,请自行替换代码中属于业务逻辑的无效变量(如model、hour、minute等):

// 假设model是你的业务模型,包含通知启用状态、重复日期列表等字段
void scheduleWeeklyRepeatingNotifications(YourBusinessModel model) async {
  if (!model.enabled!) return;

  DateTime now = DateTime.now();
  // 自定义日期映射逻辑(需替换为你自己的日期编码与星期数对应规则)
  var days = AppTranslations.getDays();
  
  for (var item in model.days!) {
    var targetDay = days.firstWhere((x) => x.dayCode == item);
    // 生成唯一通知ID,防止重复调度时覆盖已有通知
    int notificationId = int.parse('${model.id}${targetDay.dayNo}');
    
    DateTime? nextTriggerTime;
    // 查找最近的目标星期几
    for (int i = 0; i < 7; i++) {
      DateTime nextDate = now.add(Duration(days: i));
      // Dart中weekday:1=周一,7=周日,根据你的dayNo调整偏移量
      if (nextDate.weekday == (targetDay.dayNo + 1)) {
        nextTriggerTime = DateTime(nextDate.year, nextDate.month, nextDate.day, hour, minute);
        // 如果目标时间已过,自动顺延到下一周
        if (nextTriggerTime.isBefore(now)) {
          nextTriggerTime = nextTriggerTime.add(const Duration(days: 7));
        }
        break;
      }
    }

    if (nextTriggerTime == null) continue;

    // 配置通知样式与频道
    const AndroidNotificationDetails androidDetails = AndroidNotificationDetails(
      'repeat_reminder_channel',
      '重复提醒频道',
      channelDescription: '用于发送周期性重复提醒的通知频道',
      importance: Importance.high,
      priority: Priority.high,
    );
    const NotificationDetails platformChannelSpecifics = NotificationDetails(android: androidDetails);

    // 调度重复通知
    await localNotificationPlg.zonedSchedule(
      notificationId,
      '提醒',
      '喝水提醒',
      tz.TZDateTime.from(nextTriggerTime, tz.local),
      platformChannelSpecifics,
      androidAllowWhileIdle: true,
      uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime,
      // 核心参数:指定按「星期几+时间」重复触发
      matchDateTimeComponents: DateTimeComponents.dayOfWeekAndTime,
    );
  }
}

关键要点

  • matchDateTimeComponents: DateTimeComponents.dayOfWeekAndTime:这是实现每周重复的核心参数,通知会按指定的星期数与时间周期性触发。
  • 唯一ID:每个重复通知需分配唯一ID,避免调度时覆盖已存在的通知。
  • 时区处理:使用tz.TZDateTime确保通知在正确时区触发,避免跨时区时间偏差问题。

内容的提问来源于stack exchange,提问作者Burak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:16:19