StatefulWidget类
具有可变状态( state)的Widget(窗口小部件).
状态( state) 是可以在构建Widget时同步读取时 和 在Widget的生命周期期间可能改变的信息
Widget实现者的责任就是 在状态改变时通过 State.setState. 立即通知状态
当您描述的用户界面部分不依赖于对象本身中的配置信息和其中构件被夸大的BuildContext时,无状态小部件很有用。对于可以动态改变的组合,例如由于具有内部时钟驱动状态,或取决于某些系统状态,请考虑使用StatefulWidget。
StatefulWidget实例本身是不可变的,并将其可变状态存储在由createState方法创建的独立状态对象中 ,或者存储在该状态订阅的对象中,例如Stream或ChangeNotifier对象,其引用存储在StatefulWidget的最终字段中本身。
该框架只要调用一个StatefulWidget就 调用createState,这意味着如果该小部件已经插入到多个位置的树中,那么多个State对象可能与同一个StatefulWidget关联。同样,如果StatefulWidget从树中移除,后来在树再次插入时,框架将调用createState再创建一个新的国家目标,简化的生命周期状态的对象。
StatelessWidget类
不需要可变状态的小部件。
无状态小部件是一个小部件,它通过构建一系列其他小部件来更加具体地描述用户界面,从而描述用户界面的一部分。构建过程以递归方式继续进行,直到用户界面的描述完全具体(例如,完全由RenderObjectWidget组成,它描述具体的RenderObject)。
当您描述的用户界面部分不依赖于对象本身中的配置信息和其中构件被夸大的BuildContext时,无状态小部件很有用。对于可以动态改变的组合,例如由于具有内部时钟驱动状态,或取决于某些系统状态,请考虑使用StatefulWidget。
无状态小部件的构建方法通常只在以下三种情况下调用:第一次将小部件插入树中,第一次在小部件的父级更改其配置时以及第二次使用InheritedWidget时,它依赖于更改。
如果一个小部件的父节点会定期更改小部件的配置,或者如果它依赖于频繁更改的继承小部件,那么优化构建方法的性能以保持流畅的渲染性能非常重要。
有几种技术可以用来最小化重建无状态小部件的影响:
最小化构建方法及其创建的任何小部件传递创建的节点数量。例如,可以考虑只使用一个Align或一个 CustomSingleChildLayout,而不是精心安排Row s,Column s,Padding s和SizedBox es来定位一个单独的孩子。您可以考虑使用单个CustomPaint小部件,而不是使用多个Container的复杂分层和装饰 s来绘制恰当的图形效果。
const
尽可能使用小部件,并为小部件提供const
构造函数,以便小部件的用户也可以这样做。考虑将无状态小部件重构为有状态的小部件,以便它可以使用StatefulWidget中描述的一些技术,例如缓存子树的公共部分,并在更改树结构时使用GlobalKey。
如果由于使用了InheritedWidget,小部件可能会经常重建 ,请考虑将无状态小部件重构为多个小部件,并将更改后的树部分推送到树叶。例如,不是构建一个具有四个小部件的树,最内部的小部件取决于主题,而是考虑将构建最内部小部件的构建函数的部分分解到其自己的小部件中,以便只有最内部的小部件当主题改变时需要重建。