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
相关产品推荐
相关产品推荐

