Flutter組件分為有狀態(tài)(StatefulWidget)和無狀態(tài)部件(StatelessWidget)成玫,他們的區(qū)別是在運行時重新加載組件的方式不同,StatelessWidget在重新加載組件時候會重新創(chuàng)建當前組件的實例粱甫,StatefulWidget重新加載時不會重新創(chuàng)建實例,只會重新執(zhí)行build()
方法
StatelessWidget
StatelessWidget的組件一經創(chuàng)建不可改變谓着,build()
函數只會執(zhí)行一次绪商,如果需要重新繪制此組件骂束,則需要重新創(chuàng)建此組件的實例
在StatelessWidget源碼中并沒有看到update()
方法
StatefulWidget
StatefulWidget創(chuàng)建的組件可以多次調用build()
重繪,不需要重新創(chuàng)建實例成箫。
這是一個選中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執(zhí)行markNeedsBuild()
方法
2.markNeedsBuild()
會將當前的element標記為dirty,并且調用scheduleBuildFor()
函數將標記為dirty蹬昌,并調用scheduleBuildFor()
將element添加到dirty elements list
中混驰,以便在下一幀的時候重建
3.進行重建
element的重建,先看下scheduleBuildFor()
方法的注釋皂贩,
/// Adds an element to the dirty elements list so that it will be rebuilt
/// when [WidgetsBinding.drawFrame] calls [buildScope].
drawFrame()
繪制每一幀執(zhí)行的方法栖榨,
在flutter的官網或者
drawFrame()
的注釋中都標注了繪制每一幀所需要的步驟,其中第三部就是重繪在widget樹中被標記為dirty的element