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

将整数转换为时间并基于该时间调度Flutter本地通知

Flutter 基于整数值调度本地闹钟通知方案

一、核心逻辑梳理

你已完成整数转时间的操作,只需将转换后的DateTime对象传入flutter_local_notifications的调度API即可。重点要保证时间转换的准确性,同时实现避免重复设置的逻辑。

二、整数转DateTime示例

假设你的整数是HHmm格式(比如930代表9:30),转换代码如下:

DateTime convertIntToDateTime(int timeInt) {
  final hour = timeInt ~/ 100;
  final minute = timeInt % 100;
  // 基于当前日期,替换时分部分
  final now = DateTime.now();
  return DateTime(now.year, now.month, now.day, hour, minute);
}

// 如果是毫秒级时间戳,直接转换:
DateTime convertTimestampToDateTime(int timestamp) {
  return DateTime.fromMillisecondsSinceEpoch(timestamp);
}

三、flutter_local_notifications 调度通知

先初始化插件,再用zonedSchedule方法调度(适配时区问题):

import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:timezone/timezone.dart' as tz;
import 'package:timezone/data/latest.dart' as tz;

FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

// 初始化通知插件
Future<void> initNotifications() async {
  tz.initializeTimeZones();
  const AndroidInitializationSettings androidInitSettings =
      AndroidInitializationSettings('@mipmap/ic_launcher');
  const InitializationSettings initSettings =
      InitializationSettings(android: androidInitSettings);
  await flutterLocalNotificationsPlugin.initialize(initSettings);
}

// 调度闹钟通知
Future<void> scheduleAlarm(int timeInt, String alarmId) async {
  final scheduledTime = convertIntToDateTime(timeInt);
  // 转换为本地时区时间
  final tz.TZDateTime scheduledTZTime = tz.TZDateTime.from(
    scheduledTime,
    tz.local,
  );

  // 若设置时间早于当前时间,自动延后至次日同一时间
  if (scheduledTZTime.isBefore(tz.TZDateTime.now(tz.local))) {
    scheduledTZTime.add(const Duration(days: 1));
  }

  const AndroidNotificationDetails androidDetails = AndroidNotificationDetails(
    'alarm_channel',
    '闹钟通知',
    channelDescription: '用于触发闹钟提醒',
    priority: Priority.high,
    importance: Importance.max,
    enableVibration: true,
    // 可选:自定义铃声
    // sound: RawResourceAndroidNotificationSound('alarm_sound'),
  );
  const NotificationDetails notificationDetails =
      NotificationDetails(android: androidDetails);

  await flutterLocalNotificationsPlugin.zonedSchedule(
    int.parse(alarmId), // 唯一ID,用于后续取消通知
    '闹钟提醒',
    '到点啦!',
    scheduledTZTime,
    notificationDetails,
    androidAllowWhileIdle: true, // 后台锁屏状态也能触发
    uiLocalNotificationDateInterpretation:
        UILocalNotificationDateInterpretation.absoluteTime,
  );
}

// 取消指定闹钟
Future<void> cancelAlarm(String alarmId) async {
  await flutterLocalNotificationsPlugin.cancel(int.parse(alarmId));
}

四、避免重复设置的逻辑

用集合存储已激活的闹钟ID,点击复选框时做判断:

// 存储已设置的闹钟ID集合
Set<String> _activeAlarms = {};

// 复选框点击事件处理
void onAlarmCheckboxChanged(int timeInt, bool isChecked) {
  final alarmId = timeInt.toString();
  if (isChecked) {
    if (!_activeAlarms.contains(alarmId)) {
      scheduleAlarm(timeInt, alarmId);
      _activeAlarms.add(alarmId);
    }
  } else {
    cancelAlarm(alarmId);
    _activeAlarms.remove(alarmId);
  }
}

五、自定义时间选择器适配

自定义时间选择器返回小时和分钟后,直接组合成整数(比如hour * 100 + minute),传入上述scheduleAlarm方法即可,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:10:12