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

Flutter题库应用计时器异常:切换题目后加速递减求助

问题分析

你遇到的计时器加速问题,核心原因是每次切换题目时,前一题的Timer实例没有被彻底取消。当你在nextQuestion中再次调用startTimer时,新的Timer会和旧的Timer同时运行,多个Timer每秒都会执行timer -=1,导致递减速度随题目数量增加而变快(第n题就有n个Timer同时减1)。

修复方案

通过保存Timer实例,确保每次切换题目时精准取消旧Timer,再重置计时器并启动新Timer:

  1. 添加Timer成员变量,用来保存当前运行的Timer实例
Timer? _activeTimer; // 新增:保存当前Timer实例
int timer = 60; 
String showtimer = "60";
  1. 修改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();
      }
    });
  });
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:54:22