美文网首页
无状态StatelessWidget,有状态StatefulWi

无状态StatelessWidget,有状态StatefulWi

作者: 禄子_c79b | 来源:发表于2022-04-19 09:37 被阅读0次

在 Flutter 中一切的显示都是 Widget ,Widget 是一切的基础,利用响应式模式进行渲染。
Widget 分为 有状态 和 无状态 两种,在 Flutter 中每个页面都是一帧,无状态就是保持在那一帧,而有状态的 Widget 当数据更新时,其实是创建了新的 Widget(View),只是 State 实现了跨帧的数据同步保存。
如果一个控件需要动态的去改变或者相应一些状态,例如点击态、色值、内容区域等,那么一般都是继承自StatefulWidget,常见的有CheckBox、AppBar、TabBar等。其实单纯的从名字也可以看出这两种widget的区别,这两种widget都是继承自Widget类。

无状态StatelessWidget

  • 继承 StatelessWidget,通过 build 方法返回一个布局好的控件
  • Widget 和 Widget 之间通过 child: 进行嵌套。> 其中有的 Widget 只能有一个 child,

比如下方的 Container ;有的 Widget 可以多个 child ,也就是children,比如` Column 布局,下方代码便是 Container Widget 嵌套了 Text Widget。

import 'package:flutter/material.dart';

class DEMOWidget extends StatelessWidget {
  final String text;
  //数据可以通过构造方法传递进来
  DEMOWidget(this.text);
  @override
  Widget build(BuildContext context) {
    //这里返回你需要的控件
    //这里末尾有没有的逗号,对于格式化代码而已是不一样的。
    return Container(
      //白色背景
      color: Colors.white,
      //Dart语法中,?? 表示如果text为空,就返回尾号后的内容。
      child: Text(text ?? "这就是无状态DMEO"),
    );
  }
}

有状态StatefulWidget

主要是 State , 通过 State 的 build 方法去构建控件。在 State 中,你可以动态改变数据,在 setState 之后,改变的数据会触发 Widget 重新构建刷新,而下方代码中,是通过延两秒之后,让文本显示为 "这就变了数值"。
如下代码还可以看出,State 中主要的声明周期有 :

initState :初始化,理论上只有初始化一次,第二篇中会说特殊情况下。
didChangeDependencies:在 initState 之后调用,此时可以获取其他 State 。
dispose :销毁,只会调用一次。

import 'dart:async';
import 'package:flutter/material.dart';
class DemoStateWidget extends StatefulWidget {
  final String text;
  ////通过构造方法传值
  DemoStateWidget(this.text);
  ///主要是负责创建state
  @override
  _DemoStateWidgetState createState() => _DemoStateWidgetState(text);
}
class _DemoStateWidgetState extends State<DemoStateWidget> {

  String text;

  _DemoStateWidgetState(this.text);
  
  @override
  void initState() {
    ///初始化,这个函数在生命周期中只调用一次
    super.initState();
    ///定时1秒
    new Future.delayed(const Duration(seconds: 1), () {
      setState(() {
        text = "这就变了数值";
      });
    });
  }

  @override
  void dispose() {
    ///销毁
    super.dispose();
  }

  @override
  void didChangeDependencies() {
    ///在initState之后调 Called when a dependency of this [State] object changes.
    super.didChangeDependencies();
  }
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text(text ?? "这就是有状态DMEO"),
    );
  }
}

相关文章

网友评论

      本文标题:无状态StatelessWidget,有状态StatefulWi

      本文链接:https://www.haomeiwen.com/subject/arhdertx.html