flutter - Flutter 中的 `Future.delayed(Duration.zero, ...)` 和 `SchedulerBinding.instance.addPostFrameCallback(...)` 有什么区别?
问题描述
如https://stackoverflow.com/a/49458289/5150593中所见,BuildContext
在 Flutter 中(即在 中)初始渲染小部件后,基本上有两种访问方式initState
:
Future.delayed(Duration.zero, () {
// context can be used here...
});
和
SchedulerBinding.instance.addPostFrameCallback((_) {
// context can be used here...
});
这两种方法有什么区别?使用一种方法比另一种方法有什么优势吗?是否有任何我没有看到的隐藏副作用?
根据我自己的探索,如果我在同一个小部件中使用这两种方法,initState
则执行回调的顺序与注册回调的顺序相同。我查看了 Flutter 源代码Future.delayed
,SchedulerBinding.instance.addPostFrameCallback
但我真的不明白发生了什么。
解决方案
@NBM ( https://oleksandrkirichenko.com/blog/delayed-code-execution-in-flutter ) 发表的评论中的链接几乎回答了这个问题。我将在这里为后人提供一个简短的解释。
该
Future.delayed(Duration.zero, () {})
方法是使用 Dart 的事件队列的行为来延迟执行,直到下一次事件循环迭代,此时访问是安全的,context
因为可以保证构建小部件。该
SchedulerBinding.instance.addPostFrameCallback((_) {});
方法特定于 Flutter,并与小部件的生命周期相关联。最终效果仍然是等到下一次事件循环迭代,但从语义上讲,这种方法更有意义,因为我们正在使用 Flutter 机制解决 Flutter 问题。
推荐阅读
- python - 如何在 tkinter 的可滚动框架中将标签居中?
- r - 如何更改 geom_flow ggplot 的透明度?
- php - php mysql代码中的问题。如何从数据库中获取特定的有序数据并在php中作为表格视图显示到内部?
- microsoft-graph-api - 在 ChatMessage 中预览图像附件
- android - Android G Pay 检查是否添加了任何信用卡
- android - findViewById 和有什么区别
() 和 findViewById() 作为 T? - google-apps-script - 用于将特定列中的空单元格排序到顶部的 Google Apps 脚本
- python - 检查获胜者井字棋
- reactjs - 某些导航链接路线始终保持活动状态
- asp.net - 我们可以共享 iis 日志文件夹并使用日志解析器或数据库作业访问该文件夹吗?