📜  您对 Stateful 和 Stateless 小部件的理解是什么? (1)

📅  最后修改于: 2023-12-03 14:54:21.448000             🧑  作者: Mango

Stateful 和 Stateless Widget

Flutter中的Widget主要分为两种类型,Stateful Widget和Stateless Widget。两者最大的区别在于是否有状态(State)。下面我们来详细介绍一下这两种Widget。

Stateful 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

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。