我有如下代码:
Timer(Duration(seconds: 5),(){
print("This is printed after 5 seconds.");
});
print("This is printed when Timer ends");
在这种情况下我该如何使用“await”?我希望当计时器结束时运行计时器下面的下一个代码。我使用Future.delayed(),它可以做到这一点,但我不能像Timer()那样跳过Future.delayed()中的延迟时间。因为如果条件为真我想跳过延迟时间。因为如果条件为真我想跳过延迟时间。如果我使用 Future.delayed(),它没有像 Timer() 这样的 cancel() 方法。 请告诉我解决方案。谢谢
尝试使用 Future.delayed 而不是 Timer
await Future.delayed(Duration(seconds: 5),(){
print("This is printed after 5 seconds.");
});
print('This is printed when Timer ends');
有多种方法可以实现您的需求。您可以像这样使用 Completer 和
Future.any
:
import 'dart:async';
Completer<void> cancelable = Completer<void>();
// auxiliary function for convenience and better code reading
void cancel() => cancelable.complete();
Future.any(<Future<dynamic>>[
cancelable.future,
Future.delayed(Duration(seconds: 5)),
]).then((_) {
if (cancelable.isCompleted) {
print('This is print when timer has been canceled.');
} else {
print('This is printed after 5 seconds.');
}
});
// line to test cancel, comment to test timer completion
Future.delayed(Duration(seconds: 1)).then((_) => cancel());
基本上我们正在创建两种期货,一种是延迟的期货,另一种是可取消的期货。我们正在等待第一个使用
Future.any
完成的任务。
另一个选项是使用 CancelableOperation 或 CancelableCompleter。
例如:
import 'dart:async';
import 'package:async/async.dart';
Future.delayed(Duration(seconds: 1)).then((_) => cancel());
var cancelableDelay = CancelableOperation.fromFuture(
Future.delayed(Duration(seconds: 5)),
onCancel: () => print('This is print when timer has been canceled.'),
);
// line to test cancel, comment to test timer completion
Future.delayed(Duration(seconds: 1)).then((_) => cancelableDelay.cancel());
cancelableDelay.value.whenComplete(() {
print('This is printed after 5 seconds.');
});
在这里,我们实际上做了与上面相同的事情,但是使用了已经可用的类。我们将
Future.delayed
包装到 CancelableOperation
中,这样我们现在就可以取消该操作(在我们的例子中是 Future.delayed
)。
另一种方式,你可以用
Timer
等将 Completer
包装到未来。
Timer(Duration(seconds: 5),(){
print("This is printed after 5 seconds.");
printWhenTimerEnds();
});
void printWhenTimerEnds(){
print("This is printed when Timer ends");
}
当您想跳过计时器时,只需调用计时器取消和 printWhenTimerEnds() 方法
您可以将计时器与Completer结合起来,从计时器和
await
上完成它,如下所示:Completer.future
然后你可以在其他地方异步取消计时器,如下所示:
final completer = Completer<bool>();
final timer = Timer(Duration(seconds: 5),(){
print("This is printed after 5 seconds.");
if (!completer.isCompleted) {
completer.complete(false);
}
});
final result = await completer.future;
print('Is it canceled? $result');
确保您不要多次调用
timer.cancel();
if (!completer.isCompleted) {
completer.complete(true);
}
,否则您将抛出“错误状态:Future 已完成”异常。