如何在创建一个新的计时器之前检查计时器是否已经激活

11 浏览
0 Comments

如何在创建一个新的计时器之前检查计时器是否已经激活

我在另一个帖子上发现了这段计时器的代码。当同时按下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")

],

),

);

}

0
0 Comments

从上面的内容中,可以看出问题的原因是使用了不必要的空值检查符号'?.',因为接收器不能为null。解决方法是将代码中的_timer?.isActive改为_timer.isActive。同时,指出了在使用Flutter的空值安全模式下,这种写法是必需的。最后,提到这个答案并不是对问题本身的回答。

0
0 Comments

问题的出现原因是在某个项目中,使用了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)后,代码能够正常工作。感谢您的解决方案!

0