如何在Dart/Flutter中同时使用Timer和await?

问题描述 投票:0回答:4

我有如下代码:

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() 方法。 请告诉我解决方案。谢谢

flutter dart asynchronous
4个回答
3
投票

尝试使用 Future.delayed 而不是 Timer

await Future.delayed(Duration(seconds: 5),(){

                print("This is printed after 5 seconds.");
              });

              print('This is printed when Timer ends');

2
投票

有多种方法可以实现您的需求。您可以像这样使用 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
完成的任务。

另一个选项是使用 CancelableOperationCancelableCompleter

例如:

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
包装到未来。


2
投票
Timer(Duration(seconds: 5),(){
   print("This is printed after 5 seconds.");
   printWhenTimerEnds();
});

void printWhenTimerEnds(){
 print("This is printed when Timer ends");
}

当您想跳过计时器时,只需调用计时器取消和 printWhenTimerEnds() 方法


0
投票

您可以将计时器与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 已完成”异常。

    

© www.soinside.com 2019 - 2024. All rights reserved.