3 回答

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
永遠(yuǎn)不要在類上使用函數(shù)來制作可重用的widget-tree。始終將它們提取到StatelessWidget中。
使用函數(shù)而不是使用類之間存在巨大差異,即:框架不知道函數(shù),但可以看到類。
考慮以下“窗口小部件”功能:
Widget functionWidget({ Widget child}) {
return Container(child: child);
}
用這種方式:
functionWidget(
child: functionWidget(),
);
它相當(dāng)于類:
class ClassWidget extends StatelessWidget {
final Widget child;
const ClassWidget({Key key, this.child}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
child: child,
);
}
}
這樣使用:
new ClassWidget(
child: new ClassWidget(),
);
在紙上,兩者似乎做的完全一樣:創(chuàng)建2 Container,一個(gè)嵌套在另一個(gè)中。但是實(shí)際情況略有不同。
對(duì)于函數(shù),生成的窗口小部件樹如下所示:
Container
Container
在使用類時(shí),小部件樹為:
ClassWidget
Container
ClassWidget
Container
這非常重要,因?yàn)樗鼜母旧细淖兞烁滦〔考r(shí)框架的行為。以下是精選的差異列表:
類:
允許性能優(yōu)化(const構(gòu)造函數(shù),operator ==覆蓋,更精細(xì)的重建)
有熱裝
集成到小部件檢查器(debugFillProperties)
可以定義鍵
可以使用上下文API
確保所有小部件都以相同的方式使用(始終是構(gòu)造函數(shù))
確保在兩個(gè)不同的布局之間進(jìn)行切換可以正確處理資源(功能可以重用某些先前的狀態(tài))
功能:
更少的代碼(甚至在那里,我都制作了代碼生成器以使類與函數(shù)一樣小:functional_widget)
?
結(jié)論應(yīng)該已經(jīng)很清楚了:
不要使用函數(shù)創(chuàng)建小部件。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
調(diào)用Flutter小部件時(shí),請(qǐng)確保使用const關(guān)鍵字。例如const MyListWidget();
- 3 回答
- 0 關(guān)注
- 549 瀏覽
添加回答
舉報(bào)