如何在创建新计时器之前检查计时器是否处于活动状态

And*_*rio 3 timer dart flutter

我在另一个线程上遇到了这个计时器代码。当您同时按下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")
      ],
    ),
  );
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ore 5

使用 s的属性添加检查以查看是否_timer已处于活动状态。如果它已经处于活动状态,则不会创建新的。isActiveTimer

例子:

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;
          }
        },
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了你的解决方案,并且让它工作,但是当我在自己的项目中使用相同的逻辑时,假设它只是一个帮助我学习的项目,“if(!_timer?.isActive)”不起作用。我将其更改为“if(_timer !=null)”,它在我的特定代码中确实有效。感谢您的解决方案! (2认同)