flutter之Widget
在flutter中,widget分为StatelessWidget和StatefulWidget,即无状态和有状态。
状态:在构建widget时可以同步读取的信息,或者在widget的生命周期中可能更改的信息。
StatelessWidget
StatelessWidget是不需要状态更改的,即没有要管理的内部状态。
使用场景如:当用户界面不依赖于对象本身的配置信息,以及widget的BuildContext时
StatelessWidget的子类:AboutDialog,CircleAvator和Text
StatelessWidget的build方法通常只会在以下三种情况调用
- 将widget插入树中
- widget父类更改其配置
- 依赖的InheritedWidget发生变化时
StatefulWidget
StatefulWidget是可变状态的widget,使用setstate方法管理StatefulWidget的状态的改变,通过这个方法通知flutter框架某个状态发生了变化,然后调用build方法,获得最新状态。
状态是在构建widget时可以同步读取的信息可能会在widget的生命周期中发生变化。确保在状态在改变时及时通知状态变化是widget实现者的责任。当widget动态更改时,需要使用StatefulWidget。
使用场景如:通过键入表单或移动滑块来更改widget的状态,或随时间变化,或数据推送更新UI
StatefulWidget的子类:Checkbox,Radio,Slider,InkWell,Form,TextField
使用StatefulWidget,需要调用createState()方法创建StatefulWidget对象,这个对象要实现widget的build()方法,当状态改变时,需要调用setstate方法,使flutter框架在UI中重建widget。
使用区分
如果用户交互或数据改变导致widget改变,则为有状态的,
如果一个widget是最终的或不可变的,那么它就是无状态。
管理状态的三种方式
- 每个widget管理自己的状态
- 父widget管理自己的状态
- 混合搭配管理的方法
决定使用哪种方式
- 如果所讨论的状态是用户数据,例如复选框的已选中和未选中状态,或滑块的位置,则状态最好由父widget管理;
- 如果widget的状态取决于动作,例如:动画,最好有自身管理;
- 如果不确定谁管理状态,最好由父widget管理子widget的状态;