Code前端首页关于Code前端联系我们

Flutter Widget生命周期解读:为什么要分离State和Widget?

terry 2年前 (2023-09-22) 阅读数 89 #移动小程序

1:

Flutter Widget生命周期解读:为什么将State和Widget分开?

1。 initState:
当小部件首次插入小部件树时调用。对于每个State对象,Flutter框架只调用该回调一次,所以通常在该回调中,在其中执行一些一次性操作,例如初始化状态、订阅子树事件通知等,不能在该回调中调用(该方法用于获取widget树中距离当前widget最近的InheritFromWidget。InheritedWidget将在后面的章节中介绍)。这是因为初始化完成后widget树中的InheritFromWidget也可能发生变化,所以正确的做法是在build()或didChangeDependency()方法中调用它。

2。 didChangeDependency():
当 State 对象依赖关系发生变化时会被调用;例如:InheritedWidget 包含在先前的 build() 中,然后 InheritedWidget 在后续的 build() 中更改。那么此时会调用InheritedWidget子widget的didChangeDependency()回调。一个典型的场景是,当系统语言或者应用主题发生变化时,Flutter框架会通知widget调用该回调。

3。 build():
主要用于构建widget子树,在以下场景会被调用:
调用initState()后。
调用 didUpdateWidget() 后。
调用 setState() 后。
调用 didChangeDependency() 后。
将 State 对象从树中的一个位置移除(将调用 deactivate)并重新插入到树中的另一个位置后。

4。 reassemble():
该回调专门用于开发和调试。它将在热加载期间被调用。在发布模式下永远不会调用此回调。

5。 didUpdateWidget():
当一个 widget 被重建时,Flutter 框架会调用它来检测 widget 树中同一位置的新旧节点,然后决定是否需要更新。如果返回 true,则会调用此回调。如前所述,当新旧 widget 的 key 和 runtimeType 同时匹配时,将返回 true。这意味着当新旧小部件的键和runtimeType同时匹配时,didUpdateWidget()将被调用。

6。 deactivate():
当 State 对象从树中删除时,会调用此回调。在某些情况下,Flutter 框架会将 State 对象重新插入到树中,例如,当包含该 State 对象的子树从树中的一个位置移动到另一个位置时(这可以通过 GlobalKey 来实现)。如果删除后没有重新插入到树中,则将立即调用 throw() 方法。

7。 dispose():
当 State 对象从树中永久删除时调用;资源通常在此回调中释放。 ?循环,因为此时 widget State 属性为空,如果您想在构造函数中访问 widget 属性,则该属性将不起作用。但必须先调用构造函数。

initState

/// 当该对象插入到树中时调用。
插入渲染树时调用,该函数每个生命周期仅调用一次。这里可以做一些初始化工作,比如初始化状态变量。 ? 实际上这里 flutter 框架创建了一个新的 widget,绑定这个状态并在这个函数中传递旧的 widget。
该功能一般用于比较新旧widget,查看哪些属性发生了变化,以及进行一些状态调整。
需要注意的是,当涉及到驱动程序变更时,需要在该函数中删除旧的驱动程序监视器并创建新的驱动程序监视器。

deactivate

此函数将在丢弃之前调用。

处置

到达此阶段后,该部件将被销毁。该函数通常会删除监听器并清理环境。

Stage调用次数是否支持setState
构造函数1
initState未使用❙Standy无效eDependency >=1 无效
didUpdateWidget>=1
禁用♝>‽‽‽♝‸1no

3:

Flutter Widget生命周期解读:为什么将State和Widget分开?
Flutter生命周期可以分为3个阶段: 1。创建组件的实例并将其添加到树中,即。

2。状态改变,即新的widget打开或者依赖的父widget发生变化;

3。从树中删除,即。

Flutter 中的 Widget 都是不可变的,但实际上需要根据对应的状态进行更新。结果就是 StatelessWidget 和 StatefulWdiget。 StatefulWidget由两个对象组成,Widget和State。

为什么要分离 State 和 Widget?

答案是性能,状态管理状态(可以认为是控制器),而 widget 是用户界面(即视图)。每次根据状态更改生成一个小部件(即视图)可以节省内存,这意味着您不需要每次都创建一个 State 对象。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门