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(...)` 有什么区别? 的相关文章

  • 如何在flutter中绘制自定义形状卡片

    我只想创建这样的卡片 代码如下 我用的是CustomPaint小部件绘制自定义形状 然后在内部使用堆栈Card正确放置小部件的小部件 我没有图像 所以将其更改为粉红色以显示图像 这是卡片小部件的代码 然后是CustomPainter cla
  • Flutter:防止抽屉关闭

    Flutter 中是否可以防止关闭抽屉 我在用endDrawer作为网络应用程序中的表单 我已禁用滑动打开功能 并且我还希望只允许通过按钮关闭它 这样用户就不会通过单击外部意外地关闭它 但是我看不到任何布尔值 例如防止解雇或任何实施方式Wi
  • Flutter:处理错误 Dio Package(404,400 等)

    我正在学习通过包的 ID 搜索数据DIO https pub dev packages dio https pub dev packages dio 我的问题是每次我输入错误的关键字搜索时 应用程序都会突然崩溃并显示调试消息404 未找到
  • Flutter 如何制作自定义Tab Bar?

    我正在 Flutter 中构建应用程序 现在我想创建自定义选项卡栏 我想要一个如图所示的标签栏 这是一个使用的解决方案CustomPainter 标签绘制器 非常基本的路径画家来绘制选项卡的背景 class TabPainter exten
  • 如何修复导致的错误:pub get failed(69)

    我在运行 Flutter 应用程序时遇到问题 酒吧失败 69 我尝试过使用firebase storage any and firebase storage 1 0 4 version 1 0 0 1 environment sdk gt
  • 如何在 Flutter 中将国际化对象传递给子控件

    刚刚开始使用 Flutter dart 过渡到 PHP 并努力弄清楚如何将类传递到小部件中 我正在努力使用 flutter 创建我的第一个 Android 和 iOS 应用程序 我正在处理国际化 并且使用我拥有的国际化类在我的初始构建页面上
  • 当我的带有 Firestore 的 Flutter 应用程序从 Android 后台恢复时,查询速度非常慢

    使用颤振1 20 2 我的 Flutter 应用程序使用 Firestore 作为后端数据库 对于我正在使用的当前版本以及在该移动应用程序的整个开发过程中 我注意到 如果我的应用程序在后台运行一段时间 可能是几分钟 那么当我将应用程序带回前
  • TextFormString 验证器的多行字符串

    In my TextFormString对于密码字段我有validator返回一个字符串 问题是这样的String太长了 不适合屏幕 我想让它成为多行 但我找不到如何做到这一点 我尝试设置宽度Container this TextFormS
  • 禁用向下拖动以关闭 showModalBottomSheet

    如何在底部表单模态中禁用 转义向下拖动手势 以便用户可以在模态中进行交互而不会意外关闭模态 下面用实际的模态底部表进行了更新 return showModalBottomSheet context context builder Build
  • Firebase云函数在Flutter中返回null,因为它仍在运行

    更新 我从我的 firebase 控制台得到这个 函数执行花费了 2906 毫秒 完成状态代码 200 15 秒后 我得到 console log DOC 确实存在 我正在运行这个云火库功能 它 有效 但我不断得到这样的回报 FLUTTER
  • Flutter firestore插件无法通过where和isEqualTo的组合来获取数据

    我在 Firestore 中有一个名为 trips 的集合 数据格式是这样的 我正在尝试使用下面的代码访问该集合的文档 第一种方式 try Firestore instance collection trips where createdB
  • Flutter:未捕获的 ReferenceError:firebase 未定义

    我在 Flutter Web 应用程序中使用 Firebase 服务 但在加载 Firebase 脚本时遇到问题 当我使用扑动时运行 d chrome我看到有错误的空白页面 重新加载页面后加载正常 当我进行 flutter build we
  • Flutter:从子级检索顶级状态返回 null

    我正在尝试使用 of 方法获取应用程序的顶级状态 类似于 Scaffold of 函数 这是 精简的 代码 class IApp extends StatefulWidget override IAppState createState g
  • 错误:未为类“BuildContext”定义方法“inheritFromWidgetOfExactType”

    今天编译flutter项目的时候出现了这样的错误 This will generate a JSON format file containing all messages that need to be translated pub ca
  • 遵循最佳实践在 flutter 中存储 API 密钥的正确方法

    这是在 flutter 中添加秘密 API 密钥的正确方法 最佳实践 以防我想将代码推送到 github 上 我制作了一个使用 API 的简单应用程序 但我以粗略的方式使用密钥只是为了测试该应用程序是否正常工作 通常根据我在后端开发应用程序
  • 是否可以在flutter中开发移动键盘应用程序

    我们想要开发具有一些独特功能 例如在键盘上翻译 的移动键盘应用程序 第三方键盘 我们想知道是否有一种方法可以同时为 IOS 和 Android 开发一次 使用 Flutter 或者其他解决方案 对此有一个长的和一个短的答案 简短的回答基本上
  • 如何使用 Firebase_Auth 和 Flutter 登录 Twitter

    一个人应该如何编程使用 Twitter 登录特征使用firebase auth https pub dev packages firebase auth和颤动 我看到一些使用的例子flutter twitter login https pu
  • 如何在不需要打开应用程序的情况下显示对话框

    我正在寻找包或以任何方式显示弹出窗口 对话框或模式 而无需打开我的应用程序 例如 本地通知 但我不想使用本地通知进行自定义 flutter 中有类似的东西吗 在 Android 上 您可以使用使用 SYSTEM ALERT WINDOW 的
  • 带有 Firebase 通知的 Flutter Web - subscribeToTopic

    我想在我的 flutter web 应用程序中接收 firebase 通知 我知道 firebase messaging 包不可用于网络 但我已经管理配置我的应用程序以获取令牌 在网络应用程序位于后台时接收并显示消息 并在应用程序位于前台时
  • 如何在 Flutter App 中按时间注销?

    如果用户在登录后对应用程序没有反应或不活动超过 5 分钟 我需要从应用程序中注销用户 该应用程序将转到主登录页面 我尝试实施给定的解决方案here https stackoverflow com questions 52602606 how

随机推荐