Widget的概念
在面向?qū)ο蟮恼Z言中有一句話叫 一切皆對象,而在Flutter中有一種說法是 一切皆Widget
Widget是描述一個UI元素的配置數(shù)據(jù)的對象幅骄,不僅僅是一個控件闽晦,包含對一個UI元素的樣式或者事件等描述
Widget的createElement函數(shù)
Widget與Elemen的關(guān)系
從上面的概念中其實可以看出扳碍,widget只是配置信息,他不是真正呈現(xiàn)的對象仙蛉,真正顯示出來的是Elemen笋敞,一個widget可以對應(yīng)多個Elemen,也就是說Elemen可以隨便選擇需要的widget荠瘪,兩個Elemen對象選擇一個widget他們就展示出來的樣式是一樣的
StatelessWidget 和 StatefulWidget
StatelessWidget 一種無狀態(tài)改變的widget夯巷,當(dāng)描述的用戶界面部分不依賴于對象本身中的配置信息以及widget的BuildContext 時,無狀態(tài)widget非常有用哀墓,反過來就是StatefulWidget
通俗的講就是如果一個UI元素是一個不會改變的文本元素(這里可以是任何UI元素)趁餐,就用StatelessWidget ,如果這個UI元素會改變他的包括Text屬性等狀態(tài)麸祷,就用StatefulWidget澎怒,也可以這樣說 StatefulWidget包含StatelessWidget,但是StatelessWidget是不能達(dá)到StatefulWidget的效果的阶牍。
AboutDialog, CircleAvatar和 Text 都是StatelessWidget的子類。
Checkbox, Radio, Slider, InkWell, Form, 和 TextField 都是有狀態(tài)的widget星瘾,也是StatefulWidget的子類走孽。
其中從這兩個類的子類就可以大致看出這兩個類的的區(qū)別
舉個例子
繼承StatelessWidget
class PageDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
appBar: new AppBar(
title: Text("舉個例子"),
),
body: new Center(
child: Text("我繼承StatelessWidget,狀態(tài)不會改變"),
),
);
}
}
效果圖就不截了琳状,當(dāng)我們繼承StatelessWidget之后磕瓷,只需要實現(xiàn) build 函數(shù),我們沒有辦法再去修改他的狀態(tài)
繼承StatefulWidget
class PageOne extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return new TextSatte();
}
}
class TextState extends State {
var _count = 0;
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
appBar: new AppBar(
title: Text("舉個例子"),
),
body: new Stack(
children: <Widget>[
new Align(
child: Text("我繼承StatefulWidget$_count"),
),
new Align(
alignment: new FractionalOffset(0.5, 1),
child: new MaterialButton(
onPressed: () {
setState(() {
_count++;
});
},
child: Text("改變狀態(tài)"),
),
)
],
),
);
}
}
繼承StatefulWidget 之后念逞,他讓我們必須去實現(xiàn)createState函數(shù)困食,返回一個State,然后我們繼承 State 自己寫一個TextState翎承,在我們?nèi)ジ淖僓I元素狀態(tài)的時候硕盹,我們調(diào)用了一個 setState 系統(tǒng)函數(shù),然后達(dá)到了改變UI元素狀態(tài)的效果叨咖,這是繼承 StatelessWidget 做不到的
總結(jié)
這里我們學(xué)習(xí)了widget的含義瘩例,知道了他的兩個子類StatelessWidget 和StatefulWidget 的區(qū)別啊胶,其實有一些不好判斷是否需要改變狀態(tài)的UI元素,可以都用StatefulWidget來做垛贤,后面確定不需要修改之后可以再修改成StatelessWidget焰坪,熟能生巧之后,以后打代碼就更加得心應(yīng)手了聘惦。