构建方法多久被调用一次?

2023-12-31

我注意到构建方法在 flutter 应用程序中经常被调用。

我知道如果 statefulWidget 中页面的状态发生变化,则会触发构建方法。但我也注意到,即使应用程序中没有任何更改,也会调用构建方法。

考虑到您将应用程序留给自己的情况,构建方法被频繁调用是否正常?如果是这样,为什么以及多久一次?


Why

每当您调用时都会调用构建方法setState,你的小部件的依赖关系更新,或重建任何父级小部件(当setState被称为那些里面)。

您的小部件将依赖于任何InheritedWidget https://api.flutter.dev/flutter/widgets/InheritedWidget-class.html你使用,例如Theme.of(context), MediaQuery.of(context) etc.
这意味着如果主题发生变化或屏幕方向交换,你的小部件也将被重建。

当您使用像这样的小部件时MaterialApp, Scaffold等等由框架提供的,你的小部件将被重建很多,因为这些父小部件依赖于许多InheritedWidget's然后重建,这会导致您的小部件也被重建。

多常

没有数字说明有多少重建是“正常”的,因为这完全取决于您的树大小,最重要的是小部件位于该树中。如果你要跑runApp(Container()),不会有重建。

请记住,所有这些重建可能都有发生的充分理由,而 Flutter 就是为此构建的,因此您无需担心这一点。

你唯一应该开始担心的是当你有constant可能由某些构建器(调用setState内部)您使用不正确。

正是当

The 文档 https://api.flutter.dev/flutter/widgets/State/build.html列出了可以发生重建的所有特定情况:

  • 打电话后初始化状态 https://api.flutter.dev/flutter/widgets/State/initState.html.
  • 打电话后didUpdateWidget https://api.flutter.dev/flutter/widgets/State/didUpdateWidget.html.
  • 接到电话后setState https://api.flutter.dev/flutter/widgets/State/setState.html.
  • 有了这个依赖之后State https://api.flutter.dev/flutter/widgets/State-class.html对象更改(例如,继承的Widget https://api.flutter.dev/flutter/widgets/InheritedWidget-class.html前面提到的build https://api.flutter.dev/flutter/widgets/State/build.html变化)。
  • 打电话后停用 https://api.flutter.dev/flutter/widgets/State/deactivate.html然后重新插入State https://api.flutter.dev/flutter/widgets/State-class.html对象进入树中的另一个位置。

从父部件重建

如果你想了解如何InheritedWidget works, 看到这个答案 https://stackoverflow.com/a/49492495/6509751。当父小部件中的重建导致子树重建时,它也会涉及到。

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

构建方法多久被调用一次? 的相关文章

随机推荐

  • Eclipse RCP 应用程序:如何禁用特定扩展?

    我正在使用 Eclipse HELIOS 编写富客户端应用程序 以下条目会自动添加到我的应用程序 视角菜单 中 Java Java 浏览 Java 类型层次结构 团队同步 我需要摆脱他们 我正在使用扩展点 org eclipse ui ac
  • SQL Server SP_SEND_DBMAIL 图像文件附件

    我正在表上使用触发器来使用 sp send dbmail 发送电子邮件 我想在图像类型的电子邮件中包含文件附件 jpeg 的原始数据存储在二进制类型的 ndl Image 列中 我有以下代码 DECLARE ReferenceID varc
  • 使用适用于 Windows 的 Git 推送到 GitHub 时出错

    我已经在 GitHub 上创建了一个 Git 存储库 也创建了一个本地存储库 首先 我将远程存储库拉入本地存储库 然后我添加了一个文件 暂存该文件 提交了它 现在我尝试再次推送到远程存储库 但失败并显示以下消息 Pushing to htt
  • 在 Flutter 中隐藏滚动条上的底部导航栏

    我在正文和底部导航栏中有一个博客文章列表 我想在帖子列表向下滚动时使用向下滑动动画隐藏底部导航栏 并在向上滚动时使用向上滑动动画可见 怎么做 此解决方案只是解决此问题的方法 可能会发生一些有害的变化 import package flutt
  • Linq to NHibernate 与 ICriteria

    我通常经常使用 LINQ 尤其是 LINQ to Objects 因此我对 LINQ 相当熟练 我正在考虑使用 LINQ to NHibernate 作为我的 NHibernate 项目的查询语言 当我编写一些测试时 我注意到 LINQ t
  • 使用 Spring Kafka 添加自定义标头

    我计划使用 Spring Kafka 客户端在 Spring Boot 应用程序中使用 kafka 设置并生成消息 我看到 Kafka 0 11 中对自定义标头的支持详情here https issues apache org jira b
  • ionic 2 - inappbrowser“browser.on(...).subscribe 不是函数”错误

    我遵循这个http ionicframework com docs native in app browser http ionicframework com docs native in app browser 在appbrowser中使
  • Ruby 解压数组以阻止

    settings 127 0 0 1 80 0 0 0 0 443 我能怎么做 settings each do ip port end 代替 settings each do config ip port config end 您的第一个
  • 为什么我的图标不会在新的 Chrome 网上应用店中显示为完整尺寸?

    我在 Chrome 应用商店中发布了一个扩展程序 昨晚 网上商店的外观焕然一新 现在我的图标看起来非常小 位于拼图游戏的内部 我跟着指示 https developer chrome com extensions manifest icon
  • iPhone - 是否不可能获取 CALayers 组合的内容?

    我在屏幕外 UIView 比 320x480 大得多 上有一个 CALayer 进行 3D 转换 如何将 UIView 上看到的内容转储到 UIImage 中 注意 我已经编辑了问题以包含此代码 这就是我创建图层的方式 CGRect are
  • 如何从ITK注册中获得变换仿射?

    进行 3D MRI 扫描A B and C我想执行仿射 联合 配准B onto A 取配准的变换仿射矩阵并将其应用于C 我的问题是配准变换的仿射矩阵的符号错误 也许是因为方向错误 The TransformParameters包含 12 个
  • 从 UIColor 预设中获取 RGB 值

    在我的应用程序中 我将 RGB 颜色值传递给服务器 我的应用程序使用 UIColor 预定义值 例如 UIColor greyColor UIColor redColor 我知道我可以使用以下代码 const CGFloat c CGCol
  • 使用双指针时的奇怪行为

    我需要帮助来理解为什么在这个小程序中我无法正确操作指针 include
  • 如何在 vim 中创建映射以自动执行 .h c++ 文件的 ifdef 命令

    如何在 vim 中创建映射以自动执行 h c 文件的 ifdef 命令 基本上我想要一个映射来创建以下可与 h 和 hpp 等一起使用的内容 ifndef
  • 使用 Android AccountManager 进行第三方 OAuth2 授权

    我正在开发一个应用程序 需要通过 OAuth2 从第三方网络服务获得授权 第三方意味着它不是 Google 并且我不拥有它 本文 http developer android com training id auth authenticat
  • Python 中的欧拉项目#8

    求 1000 位数字中 5 个连续数字的最大乘积 import time num 73167176531330624919225119674426574742355349194934 9698352031277450632623957831
  • 如何实现didReceiveMemoryWarning?

    我开发了一个简单的位置感知 iPhone 应用程序 除了手机内存不足的情况外 该应用程序的功能非常符合我们的预期 在手机内存不足的情况下 我的应用程序只会崩溃 如果我通过释放一些空间来增加手机内存 它会再次开始正常工作而不会发生任何崩溃 当
  • Python 文件读+写

    我正在致力于将数据库从自定义 MSSQL CMS 移植到 MYSQL Wordpress 我正在使用 Python 读取 txt 文件 t划定的列和每行一行 我正在尝试编写一个 Python 脚本来读取此文件 fread 并 最终 创建一个
  • std::tuple 的实现是否允许因触发空类元素的派生到基类转换而失败?

    此代码无法使用 GCC4 7 编译 struct A void f A struct B B std tuple a void f B int main f std make tuple A 因为GCC源自A利用空基类优化 然而 这导致 G
  • 构建方法多久被调用一次?

    我注意到构建方法在 flutter 应用程序中经常被调用 我知道如果 statefulWidget 中页面的状态发生变化 则会触发构建方法 但我也注意到 即使应用程序中没有任何更改 也会调用构建方法 考虑到您将应用程序留给自己的情况 构建方