Flutter如何设置Stream每日同一时间发送事件
实现每日固定时间发送事件的Stream
要实现每天固定时间(如00:01)发送一次时间事件的Stream,核心是先计算当前时间到下一个目标时间的延迟,再结合周期流实现。直接用固定24小时间隔可能会因夏令时等因素导致时间点偏移,因此通过动态计算延迟的方式更可靠。
步骤1:计算到下一个目标时间的延迟
先写一个辅助函数,计算从当前时刻到下一次目标时间的间隔:
import 'package:flutter/material.dart'; // 使用TimeOfDay需引入此包 Duration calculateDelay(TimeOfDay targetTime) { final now = DateTime.now(); var nextTarget = DateTime(now.year, now.month, now.day, targetTime.hour, targetTime.minute); // 如果当前时间已过今日目标点,自动顺延至次日 if (now.isAfter(nextTarget)) { nextTarget = nextTarget.add(const Duration(days: 1)); } return nextTarget.difference(now); }
步骤2:实现每日定时Stream
根据需求,有两种常见实现方式:
方式一:首次等待到目标时间再发送
启动Stream后,先等待到下一个目标时间,再发送事件,之后每日同一时间触发:
Stream<DateTime> dailyTimeStream(TimeOfDay targetTime) async* { // 等待到下一个目标时间点 await Future.delayed(calculateDelay(targetTime)); // 发送首次事件 yield DateTime.now(); // 后续每日同一时间发送 yield* Stream.periodic(const Duration(days: 1), (_) => DateTime.now()); }
方式二:启动时立即发送一次,再按定时周期发送
如果需要启动Stream时先发送一次当前时间,再等待到下一个目标时间开始周期触发:
Stream<DateTime> dailyTimeStream(TimeOfDay targetTime) async* { // 启动时先发送一次 yield DateTime.now(); // 等待到下一个目标时间点 await Future.delayed(calculateDelay(targetTime)); // 后续每日同一时间发送 yield* Stream.periodic(const Duration(days: 1), (_) => DateTime.now()); }
使用示例
调用Stream时传入目标时间即可:
// 配置为每天00:01发送事件 final dailyStream = dailyTimeStream(const TimeOfDay(hour: 0, minute: 1)); // 监听Stream dailyStream.listen((time) { print("触发时间:$time"); // 在这里执行与存储DateTime比对的逻辑 });
内容的提问来源于stack exchange,提问作者Dan12314
相关产品推荐
相关产品推荐

