首页 > 技术文章 > flutter之Widget

qianyindichang 2019-06-14 14:50 原文

在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的状态;

推荐阅读