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

Flutter生日提醒应用如何实现用户指定生日日期的定时通知提醒

Flutter生日提醒应用定时通知实现方案

核心逻辑说明

生日属于年度重复事件,设置定时通知时需要优先判断当年生日是否已过,自动顺延到下一年的对应日期,同时可以配置固定的提醒时段(例如当日上午9点),保证通知触发时机符合用户预期。

具体实现步骤

  • 日期计算:提取用户录入生日的月、日字段,计算下一次提醒的触发时间
    示例代码:
// 入参:用户录入的生日日期、用户设置的提醒时分
DateTime calculateNextTriggerTime(DateTime userBirthday, TimeOfDay remindTime) {
  DateTime now = DateTime.now();
  DateTime currentYearBirthday = DateTime(now.year, userBirthday.month, userBirthday.day, remindTime.hour, remindTime.minute);
  // 今年生日已过,自动顺延到下一年
  if (currentYearBirthday.isBefore(now)) {
    return DateTime(now.year + 1, userBirthday.month, userBirthday.day, remindTime.hour, remindTime.minute);
  }
  return currentYearBirthday;
}
  • 注册年度重复定时通知
    你已经完成本地通知适配,直接使用通知插件的年度重复规则即可,无需每年手动重新注册,示例基于常用的flutter_local_notifications插件:
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

// 入参:生日记录的数据库主键ID、寿星姓名、上一步计算的下一次触发时间
Future<void> setBirthdayRemind(int recordId, String name, DateTime triggerTime) async {
  // 安卓通知渠道配置,要和你前期适配的渠道参数保持一致
  const AndroidNotificationDetails androidConfig = AndroidNotificationDetails(
    'birthday_reminder',
    '生日提醒',
    channelDescription: '生日到期提醒通知',
    importance: Importance.high,
    priority: Priority.high,
  );
  const NotificationDetails globalConfig = NotificationDetails(android: androidConfig);

  // 注册定时通知
  await flutterLocalNotificationsPlugin.schedule(
    recordId, // 用数据库主键作为通知ID,避免重复,后续修改删除可直接定位
    '生日提醒',
    '今天是$name的生日,记得送上祝福哦~',
    triggerTime,
    globalConfig,
    androidAllowWhileIdle: true,
    // 配置按日期时间重复,每年同个时间自动触发
    matchDateTimeComponents: DateTimeComponents.dateAndTime,
  );
}
  • 关联数据库逻辑
    在你的生日记录表中新增notification_id字段,存储对应通知的ID(和数据库主键一致即可),用户修改/删除生日记录时,直接调用flutterLocalNotificationsPlugin.cancel(notificationId)取消对应通知,避免无效提醒。

注意事项

  • Android 12及以上系统需要申请精确闹钟权限(SCHEDULE_EXACT_ALARM),否则定时通知可能出现延迟、不触发的问题
  • 应用重启、被系统杀死后定时通知会被清空,需要在应用启动逻辑中遍历所有生日记录,重新注册所有定时通知
  • 如果要实现提前X天提醒的功能,只需要在计算触发时间时减去对应时长即可,例如提前1天就调用triggerTime.subtract(const Duration(days: 1))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:45:03