交互
有状态(stateful)和无状态(stateless)的小部件
有些小部件是有状态的,有些是无状态的。
如果一个小部件发生变化 - 用户与它进行交互,那么它是有状态的。
小部件的状态由可以更改的值组成,例如滑块的当前值或复选框是否被选中。
小部件的状态存储在状态对象中,从而将小部件的状态与外观分开。
当小部件的状态改变时,状态对象调用
setState()
,告诉框架重绘小部件。
创建一个有状态的(stateful)小部件
要创建一个有状态的自定义小部件,需要创建两个类的子类:StatefulWidget 和 State。
状态(state)对象包含小部件的状态和小部件的
build()
方法。当小部件的状态改变时,状态对象(state)调用
setState()
,告诉框架重绘小部件。
实现一个定制的有状态小部件需要创建两个类:
定义小部件的 StatefulWidget 的子类。
State 的一个子类,它包含该小部件的状态(state)并定义小部件的
build()
方法。
第1步:决定哪个对象管理小部件的状态
第2步:创建 StatefulWidget 子类
框架在它想要构建小部件时会调用 createState()
方法。
第3步:创建 State 子类
自定义 State 类存储可变信息 - 可以在小部件的生命周期内改变的逻辑和内部状态。
状态对象还定义了构建方法。
第4步:将有状态小部件(stateful widget)插入小部件树(tree)中
管理状态(state)
有不同的方式来管理状态。
你作为小部件设计者,选择使用哪种方法。
如果有疑问,首先在父部件里管理状态。
以下是管理状态的最常见方法:
- 小部件管理自己的状态。
- 父部件管理小部件的状态。
- 混搭方法。
以下原则可以帮助您决定使用哪种方式:
- 如果有问题的状态是用户数据,例如复选框的选中或未选中模式或滑块位置,则该状态最好由父控件管理。
- 如果所讨论的状态是美学上的,例如动画,那么状态最好由小部件本身来管理。
如果有疑问,首先在父部件里管理状态。