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

