如何在Flutter中使用local_notifications创建每日内容不同的通知?
解决每日随机内容本地通知的方案
核心思路是不要一次性提前创建所有每日通知,而是采用「触发即预约下一次」的动态生成逻辑——每次通知触发后,即时生成新的随机内容并预约次日的通知,同时用本地存储记录预约状态避免重复。
具体实现步骤(以Flutter的local_notifications为例)
- 准备随机内容列表
定义需要随机选取的字符串集合:
final List<String> dailyNotificationTexts = [ "今天记得多喝温水", "起身活动5分钟吧", "今天的小目标完成了吗?", "给自己留10分钟放空时间", "今天也要保持微笑😊" ];
- 实现随机内容生成函数
import 'dart:math'; String getRandomNotificationText() { final random = Random(); return dailyNotificationTexts[random.nextInt(dailyNotificationTexts.length)]; }
- 初始化通知并配置触发回调
在初始化通知时,设置通知触发/点击后的回调,用于预约下一次通知:
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:intl/intl.dart'; final FlutterLocalNotificationsPlugin notificationsPlugin = FlutterLocalNotificationsPlugin(); Future<void> initDailyNotifications() async { // 初始化平台配置(以Android为例) const AndroidInitializationSettings androidSettings = AndroidInitializationSettings('@mipmap/ic_launcher'); const InitializationSettings initSettings = InitializationSettings(android: androidSettings); await notificationsPlugin.initialize(initSettings, onDidReceiveNotificationResponse: (response) { // 通知触发后立即预约次日通知 scheduleNextDailyNotification(); }); // App启动时检查是否需要预约当日通知 await checkAndScheduleTodayNotification(); }
- 实现预约与重复校验逻辑
用SharedPreferences记录最后一次预约的日期,避免App重启时重复创建当日通知:
// 检查并预约当日通知 Future<void> checkAndScheduleTodayNotification() async { final prefs = await SharedPreferences.getInstance(); final lastScheduledDate = prefs.getString('last_notify_date'); final today = DateFormat('yyyy-MM-dd').format(DateTime.now()); if (lastScheduledDate != today) { // 设置当日通知时间(比如早上9点) final todayNotifyTime = DateTime.now().copyWith(hour: 9, minute: 0); await scheduleSingleNotification(todayNotifyTime); await prefs.setString('last_notify_date', today); } } // 预约单个时间点的通知 Future<void> scheduleSingleNotification(DateTime scheduledTime) async { const AndroidNotificationDetails androidDetails = AndroidNotificationDetails( 'daily_notify_channel', '每日提醒', channelDescription: '每日随机内容推送', importance: Importance.max, priority: Priority.high, ); const NotificationDetails notifyDetails = NotificationDetails(android: androidDetails); // 用同一个ID覆盖旧预约,避免重复通知 await notificationsPlugin.schedule( 0, '每日小提醒', getRandomNotificationText(), scheduledTime, notifyDetails, ); } // 预约次日通知 Future<void> scheduleNextDailyNotification() async { final tomorrowNotifyTime = DateTime.now().add(const Duration(days: 1)).copyWith(hour: 9, minute: 0); await scheduleSingleNotification(tomorrowNotifyTime); // 更新最后预约日期 final prefs = await SharedPreferences.getInstance(); await prefs.setString('last_notify_date', DateFormat('yyyy-MM-dd').format(tomorrowNotifyTime)); }
关键注意事项
- 用同一个通知ID(示例中为
0),新预约会自动覆盖旧的每日通知,避免堆积 - 注意时区问题,使用
DateTime.now().toLocal()确保触发时间符合用户本地时区 - iOS平台需额外配置通知权限与后台执行权限,确保App后台能正常完成预约逻辑
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

