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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:36:08