StatefulWidget和StatelessWidget

Flutter组件分为有状态(StatefulWidget)和无状态部件(StatelessWidget),他们的区别是在运行时重新加载组件的方式不同,StatelessWidget在重新加载组件时候会重新创建当前组件的实例,StatefulWidget重新加载时不会重新创建实例,只会重新执行build()方法

StatelessWidget

StatelessWidget的组件一经创建不可改变,build()函数只会执行一次,如果需要重新绘制此组件,则需要重新创建此组件的实例
在StatelessWidget源码中并没有看到update()方法

image.png

StatefulWidget

StatefulWidget创建的组件可以多次调用build()重绘,不需要重新创建实例。
这是一个选中Checkbox的例子,跟随函数调用查看如何重绘

class CheckBoxWidgetState extends State {
  bool _isCheck = false;

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        child: Checkbox(
          value: _isCheck,
          onChanged: (bool value) {
            setState(() {
              _isCheck = value;
            });
          },
        ),
      ),
    );
  }
}

1.通过setState(){}方法使当前widget element执行markNeedsBuild()方法

setState.png

2.markNeedsBuild()会将当前的element标记为dirty,并且调用scheduleBuildFor()函数将标记为dirty,并调用scheduleBuildFor()将element添加到dirty elements list中,以便在下一帧的时候重建

markNeedsBuild.png

3.进行重建

element的重建,先看下scheduleBuildFor()方法的注释,

/// Adds an element to the dirty elements list so that it will be rebuilt
/// when [WidgetsBinding.drawFrame] calls [buildScope].

drawFrame()绘制每一帧执行的方法,

drawFrame.png

在flutter的官网或者drawFrame()的注释中都标注了绘制每一帧所需要的步骤,其中第三部就是重绘在widget树中被标记为dirty的element

image.png

你可能感兴趣的:(StatefulWidget和StatelessWidget)