如/sf/answers/3462080261/BuildContext中所示,在 Flutter 中初始渲染小部件后(即在 中initState),本质上有两种访问方式:
Future.delayed(Duration.zero, () {
// context can be used here...
});
Run Code Online (Sandbox Code Playgroud)
和
SchedulerBinding.instance.addPostFrameCallback((_) {
// context can be used here...
});
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么区别?使用一种方法相对于另一种方法有什么优势吗?是否有任何我没有看到的隐藏副作用?
根据我自己的探索,如果我在同一个小部件中使用这两种方法initState,则执行回调的顺序与注册回调的顺序相同。我查看了 Flutter 源代码Future.delayed,SchedulerBinding.instance.addPostFrameCallback但我不太明白发生了什么。
Cra*_*arr 18
@NBM ( https://oleksandrkirichenko.com/blog/delayed-code-execution-in-flutter )发表的评论中的链接几乎回答了这个问题。我将在这里为后人做一个简单的解释。
该Future.delayed(Duration.zero, () {})方法是使用 Dart 事件队列的行为来延迟执行,直到下一次事件循环迭代,此时可以安全地访问,context因为保证构建了小部件。
该SchedulerBinding.instance.addPostFrameCallback((_) {});方法特定于 Flutter,并且与 widget 的生命周期相关。最终效果仍然是等到下一次事件循环迭代,但从语义上讲,这种方法更有意义,因为我们正在使用 Flutter 机制解决 Flutter 问题。
| 归档时间: |
|
| 查看次数: |
5744 次 |
| 最近记录: |