首页
学习
活动
专区
工具
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的重建机制可以提高性能和效率。

相关搜索:在Python中调用父类中的子方法在单击父活动按钮以调用子片段中的方法时,尝试对空对象引用调用虚拟方法没有调用子状态的控制器和模板。已从子对象的父状态的同级状态转换initState()方法中异步函数调用总是在Flutter中的build()方法之后调用吗?在react native中使用父方法作为属性更新父状态时,防止子对象重新渲染在jQuery扩展对象中从父对象调用子对象的方法如何从子Widget更新父Widget的状态,同时在Flutter中更新子Widget的状态?为什么在Python中调用父方法时必须传递self参数?为什么在父类中变量的状态没有正确更新在子级useEffect中的EventListener调用的函数内访问父状态在没有显式调用的情况下,在子方法之前强制执行父方法有没有办法当子listview在flutter中结束时滚动父listview?在reactjs中,当子进程的状态改变时,如何改变父进程的状态?Flutter -为什么每次重新构建父小部件时都不调用子小部件的initState()?为什么我更新的对象没有显示在状态中?如何在父状态更新后仅调用子组件中的方法一次在Flutter中调用'await database‘后,对象的属性会发生变化吗?在父进程中调用fork()后,子进程中的内存泄漏,为什么?在React有状态组件中调用setInterval方法时,date对象未更新在Java中,有没有办法根据对象的子类调用不同的子方法?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法?

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

6.2K10

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.8K50
  • 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) - 界面开发基础

    Flutter中的Widget都是不可变的状态。 但是实际上,总要根据对应的状态,视图发生变化,所以就有了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.5K21

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

    Flutter中的Widget都是不可变的状态。 但是实际上,总要根据对应的状态,视图发生变化,所以就有了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的

    91720

    【源码分析】系列之 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 类型的父组件,并将当前组件注册到

    1.1K20

    使用InheritedWidget来进行状态管理

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

    44620

    两分钟带你掌握Flutter的StatelessWidget与StatefulWidget

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

    1.5K10

    【Flutter 组件】001-关于 Widget 的一切

    此方法是 Flutter 框架隐式调用的,在我们开发过程中基本不会调用到。 debugFillProperties(...) 复写父类的方法,主要是设置诊断树的一些特性。...在 widget 生命周期中可以被改变,当State被改变时,可以手动调用其setState()方法通知 Flutter 框架状态发生改变,Flutter 框架在收到消息后,会重新调用其 build 方法重新构建...didChangeDependencies():当 State 对象的依赖发生变化时会被调用;例如:在之前 build() 中包含了一个InheritedWidget ,然后在之后的 build() 中...我们有两种方法在子 widget 树中获取父级 StatefulWidget 的State 对象。...updateRenderObject 方法是用于在组件树状态发生变化但不需要重新创建 RenderObject 时用于更新组件渲染对象的回调。

    11510

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

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

    1.1K30

    Flutter

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

    1.9K40

    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(),

    2K30

    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.3K40

    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对象从树中被永久移除时调用;通常在此回调中释放资源。

    2.1K20

    Flutter 状态管理之GetX库

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

    55701

    Widget中的state到底是什么

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

    2.9K20
    领券