Dart 当达到某个条件时,如何使Timer.periodic自动取消?

Dart 当达到某个条件时,如何使Timer.periodic自动取消?,dart,Dart,Timer.periodic()有一个函数可以重复执行,但是,如果在计时器执行的函数之外达到任意条件,计时器是否可以自行取消?我发现的一个解决方案是将函数传递给计时器,该计时器返回一个bool,然后在满足时使用timer.cancel()。这里有一种通用的方法: periodically(int milliseconds, Function repeat, [Function cancel]) { return Timer.periodic( Duration(millisecond

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

我发现的一个解决方案是将函数传递给计时器,该计时器返回一个
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;
      }
    }
  );
}

将计时器传递到回调中。您只需对其调用
cancel()

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


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

您可以使用
流。周期性
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');
  });

我希望上面的解决方案对您很有效,但如果不行,您也可以尝试下面的代码,因为在我的情况下,上面的解决方案不起作用。

 static Timer timerObjVar;
 static Timer timerObj;

   timerObj = Timer.periodic(Duration(seconds: 10), (Timer timer) async {
      timerObjVar = timer;
      _initData();  
   });
    
 // when you want to cancel the timer call this function
  cancelTimer() {

      if (timerObjVar != null) {            
        timerObjVar.cancel();
        timerObjVar = null;
      }

      if (timerObj != null) {           
        timerObj.cancel();
        timerObj = null;
      }
  }

如果执行选项b,计时器将始终为空,即使计时器正在运行。它将运行,但当我取消它时,它会给我一个空的异常,它可能与我答案中的代码无关。我猜cancel()是在计时器初始化之前调用的。你说得对,我又做错了一件事,你的代码工作正常
 static Timer timerObjVar;
 static Timer timerObj;

   timerObj = Timer.periodic(Duration(seconds: 10), (Timer timer) async {
      timerObjVar = timer;
      _initData();  
   });
    
 // when you want to cancel the timer call this function
  cancelTimer() {

      if (timerObjVar != null) {            
        timerObjVar.cancel();
        timerObjVar = null;
      }

      if (timerObj != null) {           
        timerObj.cancel();
        timerObj = null;
      }
  }