Flutter 探索(五)StatelessWidget 与 StatefulWidget


  • 在 Android 中,View 是所有组件的根,所有的控件都是继承 View 而来,而在 Flutter 中,Widget 是所有组件的根。
  • 在原生开发中,组件的功能只作为页面展示的元素使用,而在 Flutter 中,所有的内容都是由一个个的 Widget 组成的。
  • 在 Flutter 中,Widget 子一级便分为 StatelessWidget 和 StatefulWidget 两种,分别适用无状态页面(静态)有状态页面(响应式)

一、StatelessWidget

  • StatelessWidget 继承于 Widget。
  • StatelessWidget 是一个静态的组件,其中的展示内容不会随着数据的变化而变化(非响应式)。
  • StatelessWidget 适用于组件数据不会中途发生变化的情况,而且因为它是一个无状态组件,所以性能更优,尽量多的使用 StatelessWidget 而非 StatefulWidget,可以使 Flutter 工程性能显著提升(因为 StatefulWidget 数据每次变化都会刷新布局)。

写法

// 创建一个组件继承于 StatelessWidget
// 该段代码可以输入 stless 快速生成
// 组件名命名使用大驼峰
class Name extends StatelessWidget {
  //定义变量
  var _name;
  
  //可以通过设置构造函数传递参数进来
  //通常 Widget 第一个参数是继承的 Key
  name(Key key,this._name):super(key: key);

  // build 方法,返回一个 Widget(组件),也就是 name 这个组件的样式
  @override
  Widget build(BuildContext context) {
    //return 后面写布局即可。
    //Container 是一个可以放置一个子控件的容器
    return Container();
  }
}

StatefulWidget

  • StatefulWidget 也继承于 Widget。
  • StatefulWidget 的特点是可以进行状态管理,数据更新,页面中的内容可以随之变化(响应式)
  • StatefulWidget 因为数据更新便要刷新布局,所以性能较弱,尽量在需要更新数据的组件中使用。

写法

//创建组件 Name 继承于 StatefulWidget
//该段代码可以通过 stful 快速生成
class Name extends StatefulWidget {

  var _name;

  // StatefulWidget 的特点是它是一个有状态的组件,所以这里创建一个 State
  @override
  _NameState createState() => _NameState();
}

//Name 组件的 State
//该组件的视图、生命周期都交由 State 管理
class _NameState extends State<Name> {

  //State初始化的方法
  @override
  void initState() {
    super.initState();

    // setState 方法中可以更新数据(响应式精髓)
    // setState 之后 build 方法会重新调用,所以尽量不要在 Build 中 return 之前写逻辑
    setState(() {
      //更新数据,
      widget._name = "面包超人";
    });
  }

  //当State对象从树中被永久移除时调用;通常在此回调中释放资源。
  @override
  void dispose() {
    super.dispose();
  }

  //build 调用时机
  //在调用initState()之后。
  //在调用didUpdateWidget()之后。
  //在调用setState()之后。
  //在调用didChangeDependencies()之后。
  //在State对象从树中一个位置移除后(会调用deactivate)又重新插入到树的其它位置之后。
  @override
  Widget build(BuildContext context) {
    return Container(
      //在 State 中可以通过 widget 获取到控件中的变量
      child: Text(widget._name),
    );
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。