Widget 按照状态分为两类
StatefullWidget 和 StatelessWidget
StatelessWidget :无中间状态变化的 widget,需要更新展示内容的话,就得通过重新 new, flutter 推荐尽量使用的 Widget
StatefullWidget :存在中间状态变化的 Widget,但是 疑问 来了,Widget 被设计成都是 immutable(无状态的),那么状态变化存储在哪里呢?
flutter 引入了 state 的类用于存放中间状态,通过调用 state.setState() 进行此节点及以下的整个子树更新。
那么接下来,了解一下 State(状态)的生命周期
依次来熟悉一下吧:
-
1、initState()
:state create 之后被插入到树中时调用 -
2、didUpdateWidget(newWidget)
:祖先节点重建widget 时调用 -
3、deactivate()
widget 被移除的时候调用,一个 widget 从 树中移除掉,可以在 dispose 接口被调用前,重新插入到一个新的树中 -
4、didChangeDependencies()
:
* 初始化时,在 initState() 之后立即调用
* 当依赖的 InheritedWidget rebuild,会触发此接口被调用 -
5、build()
:
* 在 initState()之后调用
* 在 didUpdateWidget 之后调用
* 接收到 setState()后调用
* 当接受到级联关系的控件状态变化时调用
* 当调用 deactivate 并且又重新插入到一个新的树时,调用 -
6、dispose()
:widget 彻底销毁时调用 -
7、reassemble()
:hot reload(热加载)的时候调用
需要注意
当 ListView 中的item 滚动出可现实区域时,item 会被从树中remove掉,此item子树中的所有 state 都会被 dispose,state 记录的数据都会销毁,item 滚动回可显示区域时,会重新创建全新的 state、element、renderebject
使用热加载时,会有没有更新的现象,这种现象本质是 state 实例没有重新创建,如果该 state 中存在复杂的资源更新,那么需要重新加载才能生效。
这个时候需要在reassemble()
添加处理