Flutter中的Widget是构建用户界面的基本构建块。Widget是一种描述UI元素的声明式方式,包括UI的结构、外观和行为。Flutter的Widget框架采用了React的灵感,将UI视为由嵌套的小部件组成的树状结构。

Flutter中的Widget可以分为两种类型:有状态的和无状态的。

1. 无状态的Widget(StatelessWidget)

无状态的Widget是一种不可变的小部件,一旦创建就不能更改其配置。它通常用于表示静态内容或与用户交互较少的部分。无状态的Widget通过继承StatelessWidget类实现。
class MyTextWidget extends StatelessWidget {
  final String text;

  MyTextWidget(this.text);

  @override
  Widget build(BuildContext context) {
    return Text(text);
  }
}

2. 有状态的Widget(StatefulWidget)

有状态的Widget是一种可变的小部件,可以在运行时更改其配置。它通常用于表示用户交互、动画或其他需要随时间变化的部分。有状态的Widget通过继承StatefulWidget和State类实现。
class MyCounterWidget extends StatefulWidget {
  @override
  _MyCounterWidgetState createState() => _MyCounterWidgetState();
}

class _MyCounterWidgetState extends State<MyCounterWidget> {
  int count = 0;

  void incrementCounter() {
    setState(() {
      count++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('Counter: $count'),
        RaisedButton(
          onPressed: incrementCounter,
          child: Text('Increment'),
        ),
      ],
    );
  }
}

Widget生命周期

有状态的Widget具有生命周期,它在被创建、插入到树中、更新和从树中删除时会调用不同的生命周期方法。这些生命周期方法包括:

  •  createState():创建相关的State对象。

  •  initState():初始化State对象,通常用于获取数据或订阅事件。

  •  build():构建并返回Widget树。

  •  didUpdateWidget():当父级重建时调用,可以比较旧的和新的配置。

  •  setState():请求框架重新构建Widget。

  •  dispose():销毁State对象,通常用于取消数据订阅或清理资源。


Widget树

在Flutter中,整个用户界面都是由小部件树构建的。Widget树是从根Widget开始,递归包含许多子Widget。当状态发生变化时,Flutter框架会重新构建Widget树,使UI保持同步。
void main() {
  runApp(
    MaterialApp(
      home: MyCounterWidget(),
    ),
  );
}

在这个例子中,MyCounterWidget是根Widget,它包含一个Column小部件,该小部件又包含Text和RaisedButton等子部件。当用户点击按钮时,setState被调用,触发build方法重新构建UI。

Widget框架的这种声明式、反应式的设计使得构建复杂UI变得直观且易于维护。同时,Flutter还提供了许多内置小部件和布局小部件,以便更轻松地构建丰富和灵活的用户界面。


转载请注明出处:http://www.zyzy.cn/article/detail/9587/Flutter