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

如何在Flutter中使用local_notifications创建每日内容不同的通知?

解决每日随机内容本地通知的方案

核心思路是不要一次性提前创建所有每日通知,而是采用「触发即预约下一次」的动态生成逻辑——每次通知触发后,即时生成新的随机内容并预约次日的通知,同时用本地存储记录预约状态避免重复。

具体实现步骤(以Flutter的local_notifications为例)

  1. 准备随机内容列表
    定义需要随机选取的字符串集合:
final List<String> dailyNotificationTexts = [
  "今天记得多喝温水",
  "起身活动5分钟吧",
  "今天的小目标完成了吗?",
  "给自己留10分钟放空时间",
  "今天也要保持微笑😊"
];
  1. 实现随机内容生成函数
import 'dart:math';

String getRandomNotificationText() {
  final random = Random();
  return dailyNotificationTexts[random.nextInt(dailyNotificationTexts.length)];
}
  1. 初始化通知并配置触发回调
    在初始化通知时,设置通知触发/点击后的回调,用于预约下一次通知:
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();
}
  1. 实现预约与重复校验逻辑
    用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:31:05