【问题标题】:What is the difference between `Future.delayed(Duration.zero, ...)` and `SchedulerBinding.instance.addPostFrameCallback(...)` in Flutter?Flutter 中的 `Future.delayed(Duration.zero, ...)` 和 `SchedulerBinding.instance.addPostFrameCallback(...)` 有什么区别?
【发布时间】:2021-01-18 23:36:53
【问题描述】:

https://stackoverflow.com/a/49458289/5150593 中所见,在 Flutter 中(即在 initState 中)初始渲染小部件后,基本上有两种访问 BuildContext 的方法:

Future.delayed(Duration.zero, () {
  // context can be used here...
});

SchedulerBinding.instance.addPostFrameCallback((_) {
  // context can be used here...
});

这两种方法有什么区别?使用一种方法比另一种方法有什么优势吗?是否有任何我没有看到的隐藏副作用?


根据我自己的探索,如果我在同一个小部件的initState 中同时使用这两种方法,回调的执行顺序与注册回调的顺序相同。我查看了 Future.delayedSchedulerBinding.instance.addPostFrameCallback 的 Flutter 源代码,但我不太明白发生了什么。

【问题讨论】:

标签: flutter


【解决方案1】:

@NBM (https://oleksandrkirichenko.com/blog/delayed-code-execution-in-flutter) 发表的评论中的链接几乎回答了这个问题。我将在这里为后人提供一个简短的解释。

  • Future.delayed(Duration.zero, () {}) 方法是使用 Dart 的事件队列的行为来延迟执行,直到下一次事件循环迭代,此时访问 context 是安全的,因为可以保证构建小部件。

  • SchedulerBinding.instance.addPostFrameCallback((_) {}); 方法是 Flutter 特有的,并且与小部件的生命周期相关联。最终效果仍然是等到下一次事件循环迭代,但从语义上讲,这种方法更有意义,因为我们正在使用 Flutter 机制解决 Flutter 问题。

【讨论】:

    猜你喜欢
    • 2020-07-16
    • 2023-01-26
    • 2021-09-06
    • 2020-09-20
    • 2020-05-06
    • 2020-04-02
    • 2018-10-25
    • 2018-10-17
    • 2020-03-23
    相关资源
    最近更新 更多