Flutter 中 `Future.delayed(Duration.zero, ...)` 和 `SchedulerBinding.instance.addPostFrameCallback(...)` 有什么区别?

2024-05-12

正如所见https://stackoverflow.com/a/49458289/5150593 https://stackoverflow.com/a/49458289/5150593,本质上有两种访问方式BuildContext最初在 Flutter 中渲染一个小部件之后(即在initState):

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

and

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

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


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


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter 中 `Future.delayed(Duration.zero, ...)` 和 `SchedulerBinding.instance.addPostFrameCallback(...)` 有什么区别? 的相关文章

随机推荐