Flutter组件分为有状态(StatefulWidget)和无状态部件(StatelessWidget),他们的区别是在运行时重新加载组件的方式不同,StatelessWidget在重新加载组件时候会重新创建当前组件的实例,StatefulWidget重新加载时不会重新创建实例,只会重新执行build()
方法
StatelessWidget
StatelessWidget的组件一经创建不可改变,build()
函数只会执行一次,如果需要重新绘制此组件,则需要重新创建此组件的实例
在StatelessWidget源码中并没有看到update()
方法
![](https://img.haomeiwen.com/i3876550/c8c8c5be29641f5b.png)
StatefulWidget
StatefulWidget创建的组件可以多次调用build()
重绘,不需要重新创建实例。
这是一个选中Checkbox的例子,跟随函数调用查看如何重绘
class CheckBoxWidgetState extends State<CheckBoxWidget> {
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()
方法
![](https://img.haomeiwen.com/i3876550/23d911a3a18b4874.png)
2.markNeedsBuild()
会将当前的element标记为dirty,并且调用scheduleBuildFor()
函数将标记为dirty,并调用scheduleBuildFor()
将element添加到dirty elements list
中,以便在下一帧的时候重建
![](https://img.haomeiwen.com/i3876550/e10c362471a870f6.png)
3.进行重建
element的重建,先看下scheduleBuildFor()
方法的注释,
/// Adds an element to the dirty elements list so that it will be rebuilt
/// when [WidgetsBinding.drawFrame] calls [buildScope].
drawFrame()
绘制每一帧执行的方法,
![](https://img.haomeiwen.com/i3876550/e03032ccf459c6d8.png)
在flutter的官网或者
drawFrame()
的注释中都标注了绘制每一帧所需要的步骤,其中第三部就是重绘在widget树中被标记为dirty的element
![](https://img.haomeiwen.com/i3876550/db7bd3447ac1b88b.png)
网友评论