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)
这样可以独立于计时器事件取消计时器。
你可以改为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)
我发现的一个解决方案是将一个函数传递给返回 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)
| 归档时间: |
|
| 查看次数: |
13272 次 |
| 最近记录: |