面试题答案
一键面试- 创建阶段:
- 构造函数调用:当创建
StatefulWidget
的实例时,首先调用其构造函数。在这里可以初始化一些不会改变的配置参数。例如:
class MyStatefulWidget extends StatefulWidget { final String initialText; MyStatefulWidget({required this.initialText}); @override _MyStatefulWidgetState createState() => _MyStatefulWidgetState(); }
createState
方法调用:接着调用createState
方法,此方法返回一个继承自State
的对象。该State
对象用于管理StatefulWidget
的可变状态。如上面代码中的_MyStatefulWidgetState
就是返回的State
对象。
- 构造函数调用:当创建
- 初始化阶段:
initState
方法调用:当State
对象被插入到Widget tree
中时,会调用initState
方法。这个方法在State
的生命周期中只会被调用一次。通常在这里进行一些一次性的初始化操作,比如初始化控制器(Controller
)、订阅流(Stream
)等。
class _MyStatefulWidgetState extends State<MyStatefulWidget> { @override void initState() { super.initState(); // 初始化操作 } }
- 构建阶段:
build
方法调用:每次State
对象需要构建其表示时,都会调用build
方法。build
方法返回一个Widget
树,描述了StatefulWidget
当前的状态。在build
方法中,可以根据State
的状态来决定返回不同的Widget
。例如:
@override Widget build(BuildContext context) { return Text(widget.initialText); }
- 状态变化阶段:
- 状态改变触发:当状态发生变化时,例如用户点击按钮、数据从服务器更新等,需要调用
setState
方法。setState
方法会通知Flutter
框架,该State
对象的状态发生了变化。
void _onButtonPressed() { setState(() { // 改变状态的逻辑,比如更新一个变量 }); }
- 重新构建:调用
setState
后,Flutter
框架会标记该State
对象需要重新构建。然后再次调用build
方法,根据新的状态生成新的Widget
树,从而更新用户界面。
- 状态改变触发:当状态发生变化时,例如用户点击按钮、数据从服务器更新等,需要调用
- 销毁阶段:
dispose
方法调用:当State
对象从Widget tree
中移除时,会调用dispose
方法。通常在这里进行一些资源释放操作,比如取消订阅流、释放控制器等。
@override void dispose() { // 释放资源操作 super.dispose(); }
主要方法的调用顺序总结如下:
MyStatefulWidget
构造函数createState
initState
- 首次
build
- 状态变化时调用
setState
- 再次
build
(因setState
触发) dispose
(State
对象从Widget tree
移除时)