StatelessWidget 和 StatefulWidget 的区别
- 定义与性质
- StatelessWidget:是不可变的,它的状态在创建后不能改变。一旦创建,其属性就固定下来,适用于展示的数据不随时间或用户交互改变的场景。
- StatefulWidget:可变,其状态可以在widget的生命周期内改变。当状态改变时,会触发UI的重新构建。
- 实现方式
- StatelessWidget:只需实现
build
方法,在该方法中根据传入的属性构建UI。
- StatefulWidget:需要创建一个继承自
StatefulWidget
的类,同时还需创建一个继承自State
类的内部类来管理状态。State
类包含build
方法以及其他生命周期方法,如initState
、dispose
等。
适用场景
- 使用StatelessWidget的场景
例如展示一个静态的文本标签,像应用的标题栏,其内容在应用运行期间不会改变,此时使用
StatelessWidget
。示例代码如下:
class StaticTitle extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text('My App Title');
}
}
- 使用StatefulWidget的场景
比如一个计数器,用户点击按钮时数字会增加,这种数据会随用户交互而改变的场景,就需要使用
StatefulWidget
。示例代码如下:
class Counter extends StatefulWidget {
@override
_CounterState createState() => _CounterState();
}
class _CounterState extends State<Counter> {
int _count = 0;
void _increment() {
setState(() {
_count++;
});
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Count: $_count'),
ElevatedButton(
onPressed: _increment,
child: Text('Increment'),
)
],
);
}
}
setState 方法的作用及触发UI更新的原理
- 作用
setState
方法用于通知Flutter框架状态发生了变化,需要重新构建UI。只有通过setState
方法改变状态,Flutter才会认为状态改变并触发UI更新。例如在上述计数器的例子中,点击按钮调用setState
使_count
变量增加,进而触发UI更新显示新的计数。
- 触发UI更新原理
当调用
setState
时,它会标记State
对象为脏(dirty)。在下一帧绘制时,Flutter框架会检查哪些State
对象是脏的,并重新调用这些State
对象的build
方法,从而重新构建对应的UI部分,实现UI的更新。