达到条件时如何使 Timer.periodic 自行取消?

Mat*_* S. 18 dart

Timer.periodic() 重复执行一个函数很好,但是如果在定时器正在执行的函数之外达到任意条件,是否可以让定时器自行取消?

Gün*_*uer 31

您将计时器传递到回调中。你可以调用cancel()它:

Timer.periodic(const Duration(seconds: 1), (timer) {
  if(condition) {
    timer.cancel();
  }
});
Run Code Online (Sandbox Code Playgroud)

或者

Timer timer;

startTimer() {
  timer = Timer.periodic(const Duration(seconds: 1), (timer) {
    if(condition) {
      cancelTimer();
    }
  });
}

cancelTimer() {
  timer.cancel();
}
Run Code Online (Sandbox Code Playgroud)

这样可以独立于计时器事件取消计时器。


Gün*_*uer 5

你可以改为Stream.periodic使用takeWhile

  bool condition = true;

  Future.delayed(const Duration(seconds: 5), () => condition = false);

  Stream.periodic(const Duration(seconds: 1))
      .takeWhile((_) => condition)
      .forEach((e) {
    print('event: $e');
  });
Run Code Online (Sandbox Code Playgroud)


Mat*_* S. 2

我发现的一个解决方案是将一个函数传递给返回 a 的计时器bool,然后timer.cancel()在满足时使用。这是执行此操作的通用方法:

periodically(int milliseconds, Function repeat, [Function cancel]) {
  return Timer.periodic(
    Duration(milliseconds: milliseconds),
    (Timer t) {
      repeat();
      if (cancel != null) {
        cancel() ? t.cancel() : null;
      }
    }
  );
}
Run Code Online (Sandbox Code Playgroud)