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

Flutter快速点击启停按钮触发多个Timer计时器运行过快如何解决

问题根因

你原有代码的核心问题是计时器实例赋值时机滞后:Timer.periodic执行后会立即返回计时器实例,但你把timer = t的赋值逻辑放在了1秒后才触发的回调函数里,这就导致从创建计时器到回调触发的1秒窗口内,全局timer变量仍然是旧值或空值,你加的timer?.isActive != true判断完全失效,快速点击就会生成多个并行运行的计时器。

修复方案

1. 核心逻辑调整

启动计时器前先强制取消已存在的计时器,同时直接接收Timer.periodic的返回值赋值给全局timer变量,不要放到回调里处理:

// 全局持有计时器实例
Timer? timer;

void startTimer() {
  // 先取消所有已存在的计时器,不管是否活跃
  timer?.cancel();
  // 直接将新创建的计时器赋值给全局变量,无需等回调
  timer = Timer.periodic(Duration(seconds: seconds), (t) {
    setState(() {
      randomNote = Random().nextInt(6);
      randomType = Random().nextInt(6);
    });
  });
}

停止计时器的逻辑可优化为取消后置空,进一步避免判断误差:

void stopTimer() {
  timer?.cancel();
  timer = null;
}

2. 额外防重优化(可选)

如果要彻底避免快速点击带来的所有并发问题,可以给启停操作加操作锁:

bool _isOperating = false;

void startTimer() {
  if (_isOperating) return;
  _isOperating = true;
  try {
    timer?.cancel();
    timer = Timer.periodic(Duration(seconds: seconds), (t) {
      setState(() {
        randomNote = Random().nextInt(6);
        randomType = Random().nextInt(6);
      });
    });
  } finally {
    _isOperating = false;
  }
}

调整后同一时间永远只会有一个运行中的计时器,不会再出现回调执行间隔异常的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:54:03