- 在 Android 中进苍,View 是所有組件的根,所有的控件都是繼承 View 而來(lái)熊楼,而在 Flutter 中霹娄,Widget 是所有組件的根。
- 在原生開(kāi)發(fā)中,組件的功能只作為頁(yè)面展示的元素使用项棠,而在 Flutter 中悲雳,所有的內(nèi)容都是由一個(gè)個(gè)的 Widget 組成的。
- 在 Flutter 中香追,Widget 子一級(jí)便分為 StatelessWidget 和 StatefulWidget 兩種合瓢,分別適用無(wú)狀態(tài)頁(yè)面(靜態(tài))與有狀態(tài)頁(yè)面(響應(yīng)式)
一、StatelessWidget
- StatelessWidget 繼承于 Widget透典。
- StatelessWidget 是一個(gè)靜態(tài)的組件晴楔,其中的展示內(nèi)容不會(huì)隨著數(shù)據(jù)的變化而變化(非響應(yīng)式)。
- StatelessWidget 適用于組件數(shù)據(jù)不會(huì)中途發(fā)生變化的情況峭咒,而且因?yàn)樗且粋€(gè)無(wú)狀態(tài)組件税弃,所以性能更優(yōu),盡量多的使用 StatelessWidget 而非 StatefulWidget凑队,可以使 Flutter 工程性能顯著提升(因?yàn)?StatefulWidget 數(shù)據(jù)每次變化都會(huì)刷新布局)则果。
寫(xiě)法
// 創(chuàng)建一個(gè)組件繼承于 StatelessWidget
// 該段代碼可以輸入 stless 快速生成
// 組件名命名使用大駝峰
class Name extends StatelessWidget {
//定義變量
var _name;
//可以通過(guò)設(shè)置構(gòu)造函數(shù)傳遞參數(shù)進(jìn)來(lái)
//通常 Widget 第一個(gè)參數(shù)是繼承的 Key
name(Key key,this._name):super(key: key);
// build 方法,返回一個(gè) Widget(組件)漩氨,也就是 name 這個(gè)組件的樣式
@override
Widget build(BuildContext context) {
//return 后面寫(xiě)布局即可西壮。
//Container 是一個(gè)可以放置一個(gè)子控件的容器
return Container();
}
}
StatefulWidget
- StatefulWidget 也繼承于 Widget。
- StatefulWidget 的特點(diǎn)是可以進(jìn)行狀態(tài)管理叫惊,數(shù)據(jù)更新款青,頁(yè)面中的內(nèi)容可以隨之變化(響應(yīng)式)
- StatefulWidget 因?yàn)閿?shù)據(jù)更新便要刷新布局,所以性能較弱霍狰,盡量在需要更新數(shù)據(jù)的組件中使用抡草。
寫(xiě)法
//創(chuàng)建組件 Name 繼承于 StatefulWidget
//該段代碼可以通過(guò) stful 快速生成
class Name extends StatefulWidget {
var _name;
// StatefulWidget 的特點(diǎn)是它是一個(gè)有狀態(tài)的組件,所以這里創(chuàng)建一個(gè) State
@override
_NameState createState() => _NameState();
}
//Name 組件的 State
//該組件的視圖蔗坯、生命周期都交由 State 管理
class _NameState extends State<Name> {
//State初始化的方法
@override
void initState() {
super.initState();
// setState 方法中可以更新數(shù)據(jù)(響應(yīng)式精髓)
// setState 之后 build 方法會(huì)重新調(diào)用康震,所以盡量不要在 Build 中 return 之前寫(xiě)邏輯
setState(() {
//更新數(shù)據(jù),
widget._name = "面包超人";
});
}
//當(dāng)State對(duì)象從樹(shù)中被永久移除時(shí)調(diào)用步悠;通常在此回調(diào)中釋放資源签杈。
@override
void dispose() {
super.dispose();
}
//build 調(diào)用時(shí)機(jī)
//在調(diào)用initState()之后。
//在調(diào)用didUpdateWidget()之后鼎兽。
//在調(diào)用setState()之后。
//在調(diào)用didChangeDependencies()之后铣除。
//在State對(duì)象從樹(shù)中一個(gè)位置移除后(會(huì)調(diào)用deactivate)又重新插入到樹(shù)的其它位置之后谚咬。
@override
Widget build(BuildContext context) {
return Container(
//在 State 中可以通過(guò) widget 獲取到控件中的變量
child: Text(widget._name),
);
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者