StatefulWidget与StatelessWidget。
StatelessWidget-不需要可变状态的小部件。
无状态窗口小部件是通过构建其他更具体描述用户界面的窗口小部件的星座来描述用户界面的一部分的窗口小部件。构建过程将以递归方式继续进行,直到用户界面的描述完全具体为止(例如,完全由描述具体RenderObject的RenderObjectWidget组成)。
在stateless
当接口您所描述的用户的部分不依赖于比在对象本身和所述配置信息的任何其他窗口小部件是有用
BuildContext其中插件被充气。对于可能由于内部时钟驱动状态或某些系统状态而动态变化的合成,请考虑使用
StatefulWidget
。
class GreenFrog extends StatelessWidget {
const GreenFrog({ Key key }) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(color: const Color(0xFF2DBD3A));
}
}
StatefulWidget-具有可变状态的小部件。
- 当您描述的用户界面部分可以动态更改时,有状态小部件很有用。
当Flutter构建一个时StatefulWidget
,它会创建一个State对象。该对象是该窗口小部件的所有可变状态的保存位置。
状态的概念由两件事定义:
1)小部件使用的数据可能会更改。
2)构建小部件时,无法同步读取数据。(必须在调用build方法时建立所有状态)。
StatefulWidget生命周期
生命周期具有以下简化步骤:
- createState() -当指示Flutter构建StatefulWidget时,它将立即调用
createState()
。
@override
_MyState createState() => _MyState();
- Mounted == true-所有小部件都具有bool
this.mounted
属性。buildContext
分配后,它变为true 。setState
卸载窗口小部件时调用是错误的。此State对象当前是否在树中。
bool get mounted => _element != null;
- initState() -这是在创建窗口小部件时调用的第一个方法(当然,在类构造函数之后)。
initState
只被调用一次。它必须调用super.initState().
@override
initState() {
super.initState();
cartItemStream.listen((data) {
_updateWidget(data);
});
}
- didChangeDependencies() -当此State对象的依赖项更改时调用。
@protected
@mustCallSuper
void didChangeDependencies() { }
- build() -描述小部件代表的用户界面部分。
框架在许多不同的情况下调用此方法:
- 打电话后
initState
。
- 打电话后
didUpdateWidget
。
- 接到的呼叫后
setState
。
- 此State对象的依存关系发生更改之后(例如,以前的构建所引用的InheritedWidget发生了更改)。
- 调用停用后,然后将State对象重新插入到另一个位置的树中。
@override
Widget build(BuildContext context, MyButtonState state) {
... () { print("color: $color"); } ...
}
- didUpdateWidget() -每当窗口小部件配置更改时调用。
如果父窗口小部件重建并请求更新树中的该位置以显示具有相同运行时类型和Widget.key的新窗口小部件,则框架将更新此State对象的窗口小部件属性以引用新窗口小部件,然后调用此窗口小部件。前一个小部件作为参数的方法。
覆盖此方法以在小部件更改时做出响应(例如,开始隐式动画)。
框架总是在调用didUpdateWidget之后调用build,这意味着在didUpdateWidget中对setState的任何调用都是多余的。
@mustCallSuper
@protected
void didUpdateWidget(covariant T oldWidget) { }
- setState() -每当您更改State对象的内部状态时,都要在传递给
setState
以下函数的函数中进行更改:
setState(() { _myState = newValue });
- deactivate() -当从树中删除State时调用Deactivate,但是可能会在当前帧更改完成之前重新插入它。之所以存在此方法,是因为状态对象可以从树中的一个点移动到另一点。
- 每当框架从树中删除此State对象时,框架都会调用此方法。在某些情况下,框架会将状态对象重新插入树的另一部分(例如,如果包含该状态对象的子树从树中的一个位置移植到另一位置)。如果发生这种情况,框架将确保它调用build以使State对象有机会适应其在树中的新位置。如果框架确实重新插入了此子树,则它将在从子树中删除该子树的动画帧结束之前这样做。因此,状态对象可以推迟释放大多数资源,直到框架调用其Dispose方法为止。
这很少使用。
@protected
@mustCallSuper
void deactivate() { }
- dispose() -当从树中永久删除该对象时调用。
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }());
}
欲了解更多信息请点击这里 这里,在这里