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
相关产品推荐
相关产品推荐

