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;
}
}