Flutter题库应用计时器异常:切换题目后加速递减求助
问题分析
你遇到的计时器加速问题,核心原因是每次切换题目时,前一题的Timer实例没有被彻底取消。当你在nextQuestion中再次调用startTimer时,新的Timer会和旧的Timer同时运行,多个Timer每秒都会执行timer -=1,导致递减速度随题目数量增加而变快(第n题就有n个Timer同时减1)。
修复方案
通过保存Timer实例,确保每次切换题目时精准取消旧Timer,再重置计时器并启动新Timer:
- 添加Timer成员变量,用来保存当前运行的Timer实例
Timer? _activeTimer; // 新增:保存当前Timer实例 int timer = 60; String showtimer = "60";
- 修改startTimer函数,启动新Timer前先取消旧的,同时在计时结束时清空实例
void startTimer() { const oneSec = Duration(seconds: 1); // 先取消可能存在的旧Timer,避免多个Timer同时运行 _activeTimer?.cancel(); _activeTimer = Timer.periodic(oneSec, (Timer t) { setState(() { if (timer < 1) { t.cancel(); _activeTimer = null; // 清空实例 nextQuestion(context); } else { timer -= 1; showtimer = timer.toString(); } }); }); }
- 修改nextQuestion方法,切换题目时先取消当前Timer,再重置计时器数值
void nextQuestion(BuildContext context) { // 取消当前运行的Timer _activeTimer?.cancel(); _activeTimer = null; // 重置计时器为初始值 timer = 60; showtimer = "60"; // 这里写你的题目切换逻辑(比如加载下一题数据) // 启动新的计时器 startTimer(); }
额外注意
- 移除原来的
canceltimer变量,因为现在通过直接操作_activeTimer实例来管理计时器,比布尔变量更可靠,避免状态不同步问题。 - 如果页面销毁(比如用户退出答题页面),记得在
dispose方法中取消Timer,防止内存泄漏:
@override void dispose() { _activeTimer?.cancel(); super.dispose(); }
内容的提问来源于stack exchange,提问作者Pramod Yadav
相关产品推荐
相关产品推荐

