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

bin*_*g45 11 time future delay dart flutter

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

未来延迟

Future.delayed(const Duration(milliseconds: 500), () { /*code*/ });
Run Code Online (Sandbox Code Playgroud)

VS

计时器

Timer _timer = new Timer(const Duration(milliseconds: 500), () { /*code*/ });
Run Code Online (Sandbox Code Playgroud)

use*_*613 10

定时器:

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

Timer t = Timer(Duration(seconds: 1), () => print("1 sec later"));
t.cancel(); // nothing will be printed out
Run Code Online (Sandbox Code Playgroud)

未来:

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

await Future.delayed(Duration(seconds: 1);
print("1 sec later");
Run Code Online (Sandbox Code Playgroud)

  • 我得到了解决方案。它接受一个“int”,而“10/2”是一个“double”,我们可以使用“10~/2”代替。谢谢。 (2认同)

enc*_*bos 9

对我来说有一些不同。

  • Future.of 返回一个 Future。
  • Timer 不返回任何东西。

因此,如果您的延迟代码返回了您继续工作所需的任何内容,这Future就是要走的路。


其他不同之处在于Timer该类提供了一种重复触发的方法。

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

可以配置为一次或重复触发的倒数计时器

而例如使用Timer重复可能

Timer.periodic(Duration(seconds: 5), (timer) {
    print(DateTime.now()); 
});
Run Code Online (Sandbox Code Playgroud)

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

格鲁!!

  • 另一个重要的区别是“定时器”可以被取消。另外,为了测量时间,通常您应该使用 [`Stopwatch`](https://api.dart.dev/stable/2.7.2/dart-core/Stopwatch-class.html) 类。 (2认同)

jit*_*555 6

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

例子:

Timer(Duration(seconds: 2), () {
      print("Execute this code afer 2 seconds");
    }); 
 print("Other code");
Run Code Online (Sandbox Code Playgroud)

输出:

Other code
Execute this code after 2 seconds
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

输出:

Execute this code after 2 seconds
Other code
Run Code Online (Sandbox Code Playgroud)

其主要缺点future是我们无法在中间取消它。


Cop*_*oad 5

如果出现以下情况,请使用计时器:

  • 您希望能够取消它。Timer.cancel()取消计时器与取消未来Future不同。CancelableCompleter

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

    例子:

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

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

    timer.cancel();
    
    Run Code Online (Sandbox Code Playgroud)

在以下情况下使用 Future:

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

  • 您想从回调方法中返回一些内容。

    例子:

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