3 回答

TA貢獻1942條經驗 獲得超3個贊
永遠不要在類上使用函數來制作可重用的widget-tree。始終將它們提取到StatelessWidget中。
使用函數而不是使用類之間存在巨大差異,即:框架不知道函數,但可以看到類。
考慮以下“窗口小部件”功能:
Widget functionWidget({ Widget child}) {
return Container(child: child);
}
用這種方式:
functionWidget(
child: functionWidget(),
);
它相當于類:
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(),
);
在紙上,兩者似乎做的完全一樣:創建2 Container,一個嵌套在另一個中。但是實際情況略有不同。
對于函數,生成的窗口小部件樹如下所示:
Container
Container
在使用類時,小部件樹為:
ClassWidget
Container
ClassWidget
Container
這非常重要,因為它從根本上改變了更新小部件時框架的行為。以下是精選的差異列表:
類:
允許性能優化(const構造函數,operator ==覆蓋,更精細的重建)
有熱裝
集成到小部件檢查器(debugFillProperties)
可以定義鍵
可以使用上下文API
確保所有小部件都以相同的方式使用(始終是構造函數)
確保在兩個不同的布局之間進行切換可以正確處理資源(功能可以重用某些先前的狀態)
功能:
更少的代碼(甚至在那里,我都制作了代碼生成器以使類與函數一樣?。篺unctional_widget)
?
結論應該已經很清楚了:
不要使用函數創建小部件。
- 3 回答
- 0 關注
- 540 瀏覽
添加回答
舉報