📅  最后修改于: 2023-12-03 14:54:21.448000             🧑  作者: Mango
Flutter中的Widget主要分为两种类型,Stateful Widget和Stateless Widget。两者最大的区别在于是否有状态(State)。下面我们来详细介绍一下这两种Widget。
Stateful Widget,也就是具有状态的Widget。这种Widget在被创建的时候会有一个状态(state),这个状态会在被创建后随时可以改变。比如一个计数器的Widget,每次点击都会改变当前计数的状态,那么这个Widget就是Stateful Widget。
Stateful Widget通常会有两个类:一个StatefulWidget和一个State类。StatefulWidget是不可变的,只有State类中的状态是可变的。StatefulWidget通常用于那些在用户交互后需要改变数据并更新UI的场景。创建Stateful Widget的代码如下:
class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int _counter = 0;
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: <Widget>[
Text('$_counter'),
RaisedButton(onPressed: () {
setState(() {
_counter++;
});
})
],
),
);
}
}
上面的代码实现了一个简单的计数器的Widget。在State类中,我们有一个int类型的_counter状态,每次点击按钮都会调用setState方法更新计数器的值,并重新渲染UI。这种方式可以方便地实现“响应式UI”的效果。
Stateless Widget,也就是无状态的Widget。这种Widget在被创建时没有状态(state),所有数据必须在创建时传递给它们,而且一旦创建后就无法更改。比如一个文本标签的Widget,它只需要传入一个字符串来显示文本,那么这个Widget就是Stateless Widget。
Stateless Widget通常用于那些不需要交互的场景。由于它们没有状态,所以更加轻量级,也更容易优化。创建Stateless Widget的代码如下:
class MyTextWidget extends StatelessWidget {
final String text;
MyTextWidget({@required this.text});
@override
Widget build(BuildContext context) {
return Text(text);
}
}
上面的代码实现了一个简单的文本标签的Widget。在构造函数中传入一个字符串,然后用Text Widget来显示这个字符串。由于这个Widget没有状态,所以就不需要State类了。
以上就是Stateful Widget和Stateless Widget的详细介绍。在实际开发中,我们可以根据具体的需求来选择使用哪种Widget类型。如果需要交互并且有状态,则使用Stateful Widget;如果不需要交互,并且只需要展示数据,则使用Stateless Widget。