Future.delayed 与 Flutter 中的 Timer 有什么区别

What is the difference between Future.delayed vs Timer in flutter

我想知道Future.delayed和Timer方法延迟代码执行的区别。两者似乎做同样的事情。

Future.delayed

Future.delayed(const Duration(milliseconds: 500), () { /*code*/ });

VS

定时器

Timer _timer = new Timer(const Duration(milliseconds: 500), () { /*code*/ });

对我来说有几点不同。

  • Future.ofreturn是未来。
  • Timer 没有 return 任何东西。

因此,如果您的延迟代码 return是您继续工作所需的任何东西,Future 是正确的选择。


另一个区别是 Timer class 提供了一种重复触发的方式。

此引用来自 Timer Class Reference 文档本身

A count-down timer that can be configured to fire once or repeatedly

使用 Timerrepeat 的例子可以是

Timer.periodic(Duration(seconds: 5), (timer) {
    print(DateTime.now()); 
});

另一个常见的例子是创建一个秒表,以测量代码中的时间,通常使用Timer

GL!!

定时器:

Timer() 创建一个 Timer 对象,它会在延迟后运行您的计算。由于您获得了对该 Timer 对象的引用,您可以选择在它被触发之前通过调用 cancel.

来取消它
Timer t = Timer(Duration(seconds: 1), () => print("1 sec later"));
t.cancel(); // nothing will be printed out

未来:

Future.delayed 创建一个 Future 在延迟后运行其计算。 在内部,它仍在使用 Timer 来执行此操作。 它不会向您公开计时器,因此您无法控制或取消它。从好的方面来说,你可以做正常的 Future 事情,比如 await

await Future.delayed(Duration(seconds: 1);
print("1 sec later");

在以下情况下使用计时器:

  • 您想要取消它的能力。使用 Timer.cancel() 你可以取消计时器,不像 Future 你必须使用 CancelableCompleter 来取消 Future。

  • 如果您不想return回调方法中的任何内容。

    示例:

    // Prints 'Hello' after 1s. 
    var timer = Timer(Duration(seconds: 1), () => print('Hello'));
    

    如果您决定取消它,请使用:

    timer.cancel();
    

在以下情况下使用 Future:

  • 您的代码可能会抛出错误,而您想捕获它们。如果您使用 Timer 并且发生任何未捕获的异常,应用程序将退出。

  • 您想 return 从您的回调方法中得到一些东西。

    示例:

    // Return 'Hello' after 1s and if there is any error, it will be caught. 
    Future
      .delayed(Duration(seconds: 1), () => 'Hello')
      .catchError((err) {}); 
    

timer 在给定的持续时间后运行其作业,但 flutter 并未等待其完成执行,而是执行以下语句。

示例:

Timer(Duration(seconds: 2), () {
      print("Execute this code afer 2 seconds");
    }); 
 print("Other code");

输出:

Other code
Execute this code after 2 seconds

所以你可以看到下面的代码会先执行定时器,然后再执行定时器。 此外,如果我们创建定时器的对象,定时器可以在其执行之前的任何给定点停止。

 Timer timer = Timer(Duration(seconds: 2), () {
          print("Execute this code afer 2 seconds");
        }); 
timer.cancel();

future 也会在给定的持续时间后运行它的作业,但是它的 return future 对象意味着我们可以使用 await 先让它执行,然后下面的语句将要执行。

 await Future.delayed(Duration(seconds: 2), () {
          print("Execute this code afer 2 seconds");
        });
        print("My Code");
    print("Other code");

输出:

Execute this code after 2 seconds
Other code

future 的主要缺点是我们不能在中间取消它。