如何在创建新计时器之前检查计时器是否活动?

3

我在另一个帖子上发现了这个计时器的代码。当您同时多次按下 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: <Widget>[
        RaisedButton(
          onPressed: () {
            startTimer();
          },
          child: Text("start"),
        ),
        Text("$_start")
      ],
    ),
  );
}
2个回答

5

使用TimerisActive属性添加一个检查,以查看_timer是否已经处于活动状态。如果它已经处于活动状态,则不会创建新的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;
          }
        },
      ),
    );
  }
}

2
我尝试了你的解决方案,它确实起作用了。但是当我在自己的项目中使用相同的逻辑时(虽然这只是一个帮助我学习的项目),if(!_timer?.isActive)却无法工作。我将其更改为if(_timer !=null),这在我的特定代码中确实有效。感谢你的解决方案! - Andrew Caprario

-1
接收器不能为空,因此无需使用空安全运算符“?.”。 将此更改为:

if(!_timer?.isActive)

if(!_timer.isActive)


是的,如果您使用具有空值安全功能的Flutter,则这是必需的。 !_timer?.isActive 意味着您要检查 _timer 是否为null。 参考信息:https://dart.dev/null-safety 此外,这不是对那个问题的答案。 - Kasun Hasanga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接