如何在创建一个新的计时器之前检查计时器是否已经激活
如何在创建一个新的计时器之前检查计时器是否已经激活
我在另一个帖子上发现了这段计时器的代码。当同时按下RaisedButton
多次时,它会为每次点击增加1秒,从而加快计时速度。
有没有什么简单的方法来检查计时器是否已经启动,如果已经启动则不让RaisedButton
创建一个新的计时器。谢谢!
import 'dart:async';
[...]
Timer _timer;
int _start = 10;
void startTimer() {
const oneSec = const Duration(seconds: 1);
_timer = new Timer.periodic(
oneSec,
(Timer timer) => setState(
() {
if (_start < 1) {
timer.cancel();
} else {
_start = _start - 1;
}
},
),
);
}
@override
void dispose() {
_timer.cancel();
super.dispose();
}
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(title: Text("Timer test")),
body: Column(
children:
RaisedButton(
onPressed: () {
startTimer();
},
child: Text("start"),
),
Text("$_start")
],
),
);
}
问题的出现原因是在某个项目中,使用了if(!_timer?.isActive)来判断定时器是否活动,但该判断并未正常工作。解决方法是将其改为if(_timer !=null)。
以下是整理好的
如何在创建新的定时器之前检查定时器是否已经活动
在使用Timer的isActive属性时,添加一个检查来查看_timer是否已经活动。如果已经活动,则不会创建新的定时器。
示例代码如下:
void startTimer() {
const oneSec = const Duration(seconds: 1);
if(!_timer?.isActive) {
_timer = new Timer.periodic(
oneSec,
(Timer timer) => setState(
() {
if (_start < 1) {
timer.cancel();
} else {
_start = _start - 1;
}
},
),
);
}
}
我尝试了您的解决方案,并使其正常工作。然而,在我的项目中使用相同的逻辑时,这个逻辑并不能正常工作。尽管这只是一个帮助我学习的项目,但我将其改为if(_timer !=null)后,代码能够正常工作。感谢您的解决方案!