0

我是编程和颤振的新手,我只是被困住了。

我想建立一个可以以固定间隔加速的节拍器。例如,每 5 秒,计时器每分钟加快 10 次。

我使用 Timer.periodic 编写了基本节拍器;现在,我认为使用新的 Timer.periodic 每 5 秒加速前一个计时器可以工作,实际上我不知道它是否有效。

如果我取消定时器的前一个实例,修改持续时间,并启动一个新的定时器,我可以听到间隙,然后它是异步的。有没有更简单的方法可以在它仍在运行时对其进行修改?还是有其他方法?

4

1 回答 1

0

没有办法Timer在它运行时修改它的间隔,所以唯一的方法是像你正在做的那样用修改后的间隔触发一个新的。

但是,我是否可以建议一个替代解决方案,而不是取消以前的计时器,而是等待它完成,然后再触发一个新的计时器。这将消除形成的“差距”。(有趣的是,使用 管理这可能有点烦人Timer.periodic,因此您可以尝试使用普通的Timer。)

class Metronome {
  double tempo;
  bool active = false;

  Metronome([this.tempo = 60.0]);

  void start() {
    active = true;
    Timer(_getDuration(), _handleEvent);
  }

  void stop() {
    active = false;
  }

  void _handleEvent() {
    // TODO: Handle metronome event, e.g. make the tick sound

    if (active) {
      Timer(_getDuration(), _handleEvent);
    }
  }

  Duration _getDuration() {
    final time = 1 / tempo;
    return Duration(
      seconds: time.toInt(),
      milliseconds: (time * 1000).toInt() % 1000,
      microSeconds: (time * 1000000).toInt() % 1000,
    );
  }
}
于 2020-02-07T16:50:07.803 回答