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

Flutter测验App问题:未选选项点击下一题时计时器意外重启

Flutter测验应用计时器问题排查与修复

问题描述

我正在用Flutter开发一款测验应用,设置了30秒的计时器,预期仅在加载新题目时启动。目前应用切换新题后计时器能正常重启,但存在问题:未选择任何选项就点击“下一题”按钮时,计时器也会重启,而原本设计该按钮需要选择选项后才能进入下一题。

代码问题定位

问题出在nextQuestion方法中:

  • 方法开头直接执行了canceltimer = false和timer = 30,无论用户是否选择选项都会重置计时器状态
  • 未选择选项的else分支里依然调用了starttimer(),导致计时器被强制重启

修改方案

调整nextQuestion的逻辑,仅在用户已选择选项(isPressed为true)时,才重置计时器并启动新的倒计时,未选择选项时仅弹出提示,不改动当前计时器:

修改后的nextQuestion方法

void nextQuestion(int questionLength) {
  if (index == 19 || score == 12) {
    showDialog(
        context: context,
        barrierDismissible: false,
        builder: (ctx) => ResultBox(
              result: score,
              questionLength: questionLength,
            ));
  } else {
    if (isPressed) {
      setState(() {
        canceltimer = false;
        timer = 30;
        index++;
        isPressed = false;
        isAlreadySelected = false;
        starttimer();
      });
    } else {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(
        content: const Text('Please select any option'),
        behavior: SnackBarBehavior.floating,
        margin: EdgeInsets.symmetric(vertical: 20.0),
      ));
      // 移除此处的starttimer()调用,避免未选选项时重启计时器
    }
  }
}

额外优化

starttimer方法中的async关键字是多余的(Timer.periodic不需要异步执行),建议移除:

void starttimer() {
  const onesec = Duration(seconds: 1);
  Timer.periodic(onesec, (Timer t) {
    setState(() {
      if (timer < 1) {
        t.cancel();
        nextQuestion(index++);
      } else if (canceltimer == true) {
        t.cancel();
      } else {
        timer = timer - 1;
      }
      showtimer = timer.toString();
    });
  });
}

修改后效果

  • 未选择选项点击“下一题”:仅弹出提示,当前计时器继续倒计时,不会重置或重启
  • 选择选项后点击“下一题”:计时器重置为30秒并启动新的倒计时,正常切换到下一题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:18:18