首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在flutter中父状态发生变化时,没有调用子对象的build方法?

在Flutter中,当父状态发生变化时,子对象的build方法不会被直接调用。这是因为Flutter采用了一种称为"基于Diff的重建"的机制来提高性能和效率。

在Flutter中,Widget树是不可变的,当父状态发生变化时,Flutter会比较新旧Widget树的差异,并且只更新发生变化的部分。这意味着只有发生变化的部分会重新构建,而不是整个Widget树。

当父状态发生变化时,Flutter会调用父Widget的build方法来创建新的Widget树。然后,Flutter会比较新旧Widget树的差异,并将差异应用到渲染树中。在这个过程中,Flutter会更新发生变化的部分,并且会调用相应的Widget的build方法来构建新的部分。

因此,子对象的build方法只有在其所在的部分发生变化时才会被调用。如果子对象所在的部分没有发生变化,那么子对象的build方法就不会被调用。

这种机制可以提高性能和效率,因为不需要每次父状态发生变化时都重新构建整个Widget树。只有发生变化的部分才会被重新构建,从而减少了不必要的计算和渲染操作。

总结起来,当父状态发生变化时,Flutter会比较新旧Widget树的差异,并且只更新发生变化的部分。子对象的build方法只有在其所在的部分发生变化时才会被调用。这种基于Diff的重建机制可以提高性能和效率。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

创建子类对象类构造函数调用被子类重写方法为什么调用是子类方法

A对象时候类会调用子类方法?...但是:创建B对象类会调用方法? 答案: 当子类被加载到内存方法区后,会继续加载类到内存。...如果,子类重写了方法,子类方法引用会指向子类方法,否则子类方法引用会指向方法引用。 如果子类重载了方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载方法,则方法引用会指向方法。 当子类对象创建,会先行调用构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译时候,类构造方法调用方法参数已经强制转换为符合方法参数了。 上边代码在编译前已经转换为下面这个样子了。

6.1K10

Flutter跨平台移动端开发丨Widget、Element、State、状态管理

StatelessWidget:无状态,比如标题栏标题 StatefulWidget:有状态,创建需要指定一个 State ,需要更新 UI时调用 setState(VoidCallbackfn...,路由切换,切换动画会随平台不同而变化 Cupertino 遵循 IOS 应用风格,目前还没有 Material 库丰富。...要维护状态,保存状态信息可以 build 被获取,同时, widget 生命周期中可以被改变,改变发生,可以调用其 setState() 方法通知 framework 发生改变,framework...State 生命周期 initState:当前 widget 对象插入 widget树调用 didChangeDependencies:当前 State 对象依赖项发生变化调用 build:绘制当前界面布局时调用...管理状态常见方法: widget 管理自己 state widget 管理 widget 状态 混合管理 决定状态管理原则: 有关用户数据由 widget 管理 有关界面效果由 widget

1.7K50

Flutter | 基础Widget

方法Flutter FrameWork 隐式调用我们开发过程基本不会调用到。...被改变,可以手动调用 setState() 方法通知 Flutter framework 状态发生改变,flutter framework 收到消息后,会调用build 方法重新构建 widget...也可以会发生变化,所以正确做法应该是 build 方法或者 didChangeDependencies 调用它 didChangeDependencies() 当 State 对象依赖发生变化时会被调用...如果移除之后没有重新插入到树则紧接着就会调用 dispose() 方法 dispose() 当 State 对象从树中被永久移除时调用;通常此回调释放资源 class CounterWidget...对象 由于 StatefulWidget 具体逻辑都在其 State ,所有很多时候,我们都需要获取 StatefulWidget 对应 State 对象调用一些方法,对此,我们有两种方法

1.2K20

Flutter入门三部曲(2) - 界面开发基础

FlutterWidget都是不可变状态。 但是实际上,总要根据对应状态,视图发生变化,所以就有了state。用它来保持我们状态。...因为State每次重建没有抛弃,所以可以维护它并且不必每次重建某些东西都要进行昂贵计算以获得状态属性。 此外,这是允许Flutter动画存在原因。...6. didUpdateWidget(Widget oldWidget) 如果组件发生变化,而且必须去重建widget,而且被相同runtimeType重建,这个方法会被调用。...因为Flutter是复用state。所以,你可能需要重新初始化状态。 如果你Widget是需要根据监听数据,发生变化,那么你就需要从旧对象反注册,然后注册新对象。...此方法存在主要是因为State对象可以从树一个点移动到另一个点。 这很少使用。 9. dispose() State删除对象调用Dispose ,这是永久性

2.6K00

第130期:flutter状态组件和状态管理

当小部件状态发生变化时,状态对象调用setState(),告诉框架重新绘制小部件。 创建状态组件 需要注意是: /** 1....当组件状态发生变化时,state对象调用setstate方法,通知框架重新绘制组件。 **/ 创建一个自定义状态组件需要创建两个类: /** 1....方法调用setState来更新组件展示 组件管理状态 通常情况下,组件管理状态并通知其组件何时更新是最有意义。...onChanged属性方法,当点击组件TapboxB,会触发组件_handleTapboxChanged方法,通知组件,从而实现组件更新。...onTapDown和onTapUp调用setState()方法更新UI,并且_higlight状态发生变化_handleTap,将状态传递到付组件,通知组件进行更新。

1.5K20

Flutter入门三部曲(2) - 界面开发基础

FlutterWidget都是不可变状态。 但是实际上,总要根据对应状态,视图发生变化,所以就有了state。用它来保持我们状态。...因为State每次重建没有抛弃,所以可以维护它并且不必每次重建某些东西都要进行昂贵计算以获得状态属性。 此外,这是允许Flutter动画存在原因。...6. didUpdateWidget(Widget oldWidget) 如果组件发生变化,而且必须去重建widget,而且被相同runtimeType重建,这个方法会被调用。...因为Flutter是复用state。所以,你可能需要重新初始化状态。 如果你Widget是需要根据监听数据,发生变化,那么你就需要从旧对象反注册,然后注册新对象。...此方法存在主要是因为State对象可以从树一个点移动到另一个点。 这很少使用。 9. dispose() State删除对象调用Dispose ,这是永久性

1.6K20

Flutter | 和小老弟一起玩转Widget

Flutter世界,一切都是Widget,即一切都是组件 why? 为什么一切都是组件,怎么理解呢?...createElement() Flutter Framework构建UI树,会先调用方法生成对应节点 Element 对象,此方法Flutter Framework 隐私调用。...也可能会发生变化,所以正确做法应该在 build 方法或 didChangDependencied() 调用它。...如果移除后没有重新插入到树则紧挨着会调用 disponse 方法。 dispose() 当State对象从树中被永久移除时调用,通常用于在此回调释放资源。...Scaffold 组件对应状态类 ScaffoldState 中就定义了打开 SncakBar(路由底部提示条)方法,我们有两种方法 widget 树获取 级 StatefulWidget

87120

【源码分析】系列之 InheritedWidget

另外,当此 State 对象依赖项更改时被调用,比如其所依赖 InheritedWidget 发生变化时, Framework 会调用方法通知组件发生变化。...方法,而 A 组件没有调用 didChangeDependencies 方法,因为 A 没有依赖 MyInheritedWidget 组件。...和 age)都没有发生变化,updateShouldNotify 应该返回false,但实际打印结果: flutter: updateShouldNotify:true flutter: A build...flutter: F didChangeDependencies flutter: F build 实际返回了 true,因为前后 _userInfo 对象引用发生了变化, UserInfo 重写...组件执行 dependOnInheritedWidgetOfExactType 方法,从 _inheritedWidgets 集合获取指定 InheritedWidget 类型组件,并将当前组件注册到

99420

两分钟带你掌握FlutterStatelessWidget与StatefulWidget

这个类继承了StatelessWidget-它包含不可变数据 无状态widgetbuild方法通常只会在以下三种情况调用: 将widget插入树 当widget级更改其配置 当它依赖InheritedWidget...调用setState告诉Flutter框架,某个状态发生了变化,Flutter会重新运行build方法,以便应用程序可以应用最新状态。...状态构建widget可以同步读取信息可能会在widget生命周期中发生变化。确保状态改变及时通知状态 变化是widget实现者责任。...以下状态类_MyStatefulWidgetState实现widgetbuild()方法。当状态改变,例如,当用户切换按钮,使用新切换值调用setState。...确定哪个对象管理widget状态(对于StatefulWidget) Flutter,管理状态有三种主要方式: 每个widget管理自己状态 widget管理widget状态 混合搭配管理方法

1.4K10

使用InheritedWidget来进行状态管理

之前我写过一篇文章使用Provider来进行状态管理,介绍了Flutter如何通过Provider来进行状态管理,今天我们来介绍状态管理另外一种方式——InheritedWidget。...而这里这个“依赖”,指就是widget是否使用了widgetInheritedWidget数据,如果使用了则代表widget有依赖InheritedWidget,如果没有使用则代表没有依赖...比如在主题、locale(语言)等发生变化时候,依赖其widgetdidChangeDependencies方法将会被调用。...不过一定需要再次着重说明一点是,如果_TestWidgetbuild方法没有使用ShareDataWidget数据,那么它didChangeDependencies将不会被调用,因为它并没有依赖...而当调用是 getElementForInheritedWidgetOfExactType(),由于没有注册依赖关系,所以之后当InheritedWidget发生变化时,就不会更新相应子孙 Widget

40320

flutter系列之:flutter架构什么,看完这篇文章就全懂了

我们先来猜一下,这些信息,哪些是用来构建Widget? 大家第一间想到应该是child,它本身就是一个Widget,用来表示Container包含对象,这个很好理解。...之前提到了Widgets是不可变,StatefulWidget可变数据是存放在对应State,所以StatefulWidgets本身并没有build方法,所有用户界面都是通过State对象来构建...当State发生变化时候,需要调用setState() 方法来通知flutter框架来调用Statebuild方法,从而将变化反馈到用户界面。...FrogColor.of方法context是FrogColorcontext,所以是找不到FrogColor对象,这样使用是错误。...当flutter想要渲染这个widget时候,会去调用build() 方法,然后生成一个widget集合. 为什么是Widget集合呢?

84330

Flutter

布局过程,渲染对象每个渲染对象都会接收对象布局约束参数,决定自己大小,然后父对象按照控件逻辑决定各个子对象位置,完成布局过程。...五、Flutter基础 StatelessWidget Widget 采用由、自顶向下方式进行构建, Widget 控制着 Widget 显示样式,其样式配置由 Widget 构建提供...setState:我们最熟悉方法之一。当状态数据发生变化时,我们总是通过调用这个方法告诉 Flutter:“我这儿数据变啦,请使用更新后数据重建 UI!”...didUpdateWidget:当 Widget 配置发生变化时,比如, Widget 触发重建(即 Widget 状态发生变化时),热重载,系统会调用这个函数。...销毁 系统会调用 deactivate 和 dispose 这两个方法,来移除或销毁组件。 当组件可见状态发生变化时,deactivate 函数会被调用,这时 State 会被暂时从视图树移除。

1.9K40

Flutter之 State 生命周期

可以通过构造方法,来接收 Widget 传递初始化 UI 配置数据,而这些配置数据,决定了 Widget 最初呈现状态      initState: State 对象被插入视图树时调用。... build ,需要根据 Widget 传递过来初始化配置数据及 State 的当前状态,创建一个 Widget 然后返回      更新      Widget 状态更新,主要由 setState...:Widget 配置发生变化时,或热重载,系统会回调该方法      一旦这三个方法调用Flutter 随后便会销毁旧 Widget,并调用 build 方法重建 Widget      销毁...比如页面销毁时或是组件被移除,系统会调用 deactivate 和 dispose 这两个方法,来移除或销毁组件      当组件可见状态发生变化时,deactivate 方法会被调用,这时 State...注意:页面切换,由于 State 对象视图树位置发生了变化,需要先暂时移除后再重新添加,重新触发组件构建,因此也会调用 deactivate 方法      当 State 被永久地从视图树移除

1.2K40

Flutter | 数据共享

这种机制可以使组件所依赖 InheritedWidget 变化时来更新自身,例如主题,等发生变化时候,依赖 widget didChangeDependencies 方法就会被调用 下面看一个栗子...方法就会被调用。需要注意是如果 TestShareWidget build 方法没有使用 ShareDataWidget 数据,那么他 did......方法做什么 一般来说, widget 会很少重新此方法,应为依赖发生改变之后也会调用 build 方法。...被执行; 跨组件状态共享 Provider Flutter 状态管理一般原则是: 如果组件是私有的,则组件自己管理状态 如果要跨组件共享,则状态由共同组件来管理 对于跨组件共享状态,管理方式有很多...,并没有实现数据共享,另外,我们实现有些边界值没有考虑到,比如如何保证 Widget 树重新 build Mode 始终是单例等等。

1.3K30

flutter跨平台原理

布局 Flutter 深度优先遍历渲染对象树。数据流传递方式是从上到下传递约束,从下到上传递大小。...也就是说,节点会将自己约束传递给节点,节点根据接收到约束来计算自己大小,然后将自己尺寸返回给节点。...整个过程,位置信息由节点来控制,节点并不关心自己所在位置,而节点也不关心子节点具体长什么样子。...StatelessWidget:内部没有保存状态,UI界面创建后不会发生改变; StatefulWidget:内部有保存状态,当状态发生改变,调用setState()方法会触发StatefulWidget...; Build: 对于dirty元素会执行build构造,没有dirty元素则不会执行,对应于buildScope() Layout: 计算渲染对象大小和位置,对应于flushLayout(),

1.9K30

Flutter Widget源码解析及实战

用于不需要维护状态场景,它通常在build方法通过嵌套其它Widget来构建UI,构建过程中会递归构建其嵌套Widget,具体如下: StatefulWidget 可变状态小部件 与StatelessWidget...下面是StatefulWidget最佳实践: 尽量将需要该表状态widget防止节点,这样改变整个渲染树时候就只需要更新一个widget即可,如果将其防止节点那么将会导致当前节点整个子节点...didChangeDependencies:当State对象依赖发生变化时会被调用,如果Widget重建并请求树此位置更新以显示具有相同[runtimeType]和[Widget.key]新Widget...一些场景下,Flutter framework会将State对象重新插到树,如包含此State对象子树一个位置移动到另一个位置(可以通过GlobalKey来实现)。...如果移除后没有重新插入到树则紧接着会调用dispose()方法。 dispose:当State对象从树中被永久移除时调用;通常在此回调释放资源。

2K20

Flutter 状态管理之GetX库

属性(props)创建被设置,并且整个生命周期中保持不变。 当级小部件发生更改时,StatelessWidget 将重新构建,但状态不会发生变化。...它具有一个持久状态对象(State),用于存储和跟踪小部件变化。 当级小部件发生更改时,StatefulWidget 通过更新关联状态对象来重新构建。...每当HomePage状态发生变化时,Flutter调用_HomePageState类build方法来构建最新UI,下面我们再来看_HomePageState,代码如下所示: class _HomePageState...body,使用Align组件将其组件容器居中显示。Alignment.center表示组件容器居中对齐。...()方法通过Get.put(HomeController()),得到控制器对象,然后Text通过控制器得到里面的值,同样可以调用里面的方法,这样我们就将业务和UI分离了。

6500

Widgetstate到底是什么

对应到Flutter,意图是绑定了组件状态State,结果则是重新渲染后组件。Widget生命周期内,应用到State任何更改都将强制Widget重新构建。...StatelessWidget Flutter,Widget采用由、自顶而下方式进行构建,Widget控制着Widget显示样式,其样式配置由Widget构建提供。...return result; } } 可以看到,构造方法将其属性列表赋值后,build方法随即将组件RichText通过其属性列表(如文本data、对齐方式textAlign、文本展示方向textDirection...然而,不同是,Image类并没有build方法来创建视图,而是通过creatState方法创建了一个类型为_ImageStateState对象,然后由这个对象负责视图构建。...由于Widget是采用由、由顶而下方式进行构建,因此自定义组件,我们可以根据Widget是否能通过初始化参数完全控制其UI展示效果基本原则,来判断究竟是继承StatelessWidget

2.9K20

Stateful 组件生命周期​

didChangeDependencies 方法调用后,组件状态变为 dirty,立即调用 build 方法。 生命周期四:build方法是我们最熟悉方法创建各种组件,绘制到屏幕上。...生命周期六:deactivate 当框架从树移除此 State 对象将会调用方法某些情况下,框架将重新插入 State 对象到树其他位置(例如,如果包含该树子树 State 对象从树一个位置移植到另一位置...),框架将会调用 build 方法来提供 State 对象适应其新位置。...为什么要加上如此判断?因为如果当前组件未插入到树或者已经从树移除调用 setState 会抛出异常,加上 mounted 判断,则表示当前组件。...dirty 和 clean dirty 表示组件当前状态为 脏状态,下一帧将会执行 build 函数,调用 setState 方法或者 执行 didUpdateWidget 方法后,组件状态为 dirty

96310
领券