将整数转换为时间并基于该时间调度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
相关产品推荐
相关产品推荐

