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

Flutter中如何暂停定时器直至getList方法执行完成?

解决方案

你当前用Timer.periodic的问题在于,定时器会严格按60秒间隔触发回调,不管getList()是否执行完成,这可能导致多个异步任务重叠运行。要实现“等待getList()完成后再继续计时”的效果,推荐放弃periodic,改用递归调度一次性定时器或者循环+延迟的方式,两种方案都能满足需求:

方案一:递归调度一次性Timer

这种方式每次在getList()执行完成后,再调度下一次刷新,逻辑清晰且容易控制启停:

Timer? _refreshTimer;

// 启动刷新循环
void startRefresh() {
  _scheduleNextRefresh();
}

// 停止刷新
void stopRefresh() {
  _refreshTimer?.cancel();
  _refreshTimer = null;
}

// 内部调度方法:先等60秒再执行任务
void _scheduleNextRefresh() {
  _refreshTimer = Timer(const Duration(seconds: 60), () async {
    await getList();
    // 任务完成后,继续调度下一次
    _scheduleNextRefresh();
  });
}

如果希望先执行getList(),再等待60秒,只需要调换顺序:

void _scheduleNextRefresh() async {
  await getList();
  await Future.delayed(const Duration(seconds: 60));
  _refreshTimer = Timer(const Duration(seconds: 0), _scheduleNextRefresh);
}

方案二:while循环+await

用while循环配合await实现持续刷新,适合需要更直接控制循环终止的场景:

bool _shouldContinueRefresh = false;

void startRefresh() {
  _shouldContinueRefresh = true;
  _refreshLoop();
}

void stopRefresh() {
  _shouldContinueRefresh = false;
}

Future<void> _refreshLoop() async {
  while (_shouldContinueRefresh) {
    await getList();
    await Future.delayed(const Duration(seconds: 60));
  }
}

这两种方案的核心逻辑都是:必须等待上一次getList()执行完成,才会开始下一轮的计时/任务执行,完全避免了任务重叠的问题,也实现了你要的“暂停定时器直到任务完成”的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:05:14