亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

創建窗口小部件的函數和類有什么區別?

創建窗口小部件的函數和類有什么區別?

楊__羊羊 2019-11-26 11:06:43
我已經意識到,可以使用普通函數創建小部件,而不是將StatelessWidget子類化。一個例子是這樣的:Widget function({ String title, VoidCallback callback }) {  return GestureDetector(    onTap: callback,    child: // some widget  );}這很有趣,因為它需要遠遠比一個全面的類更少的代碼。例:class SomeWidget extends StatelessWidget {  final VoidCallback callback;  final String title;  const SomeWidget({Key key, this.callback, this.title}) : super(key: key);  @override  Widget build(BuildContext context) {      return GestureDetector(        onTap: callback,        child: // some widget      );  }}所以我一直在想:創建小部件的函數和類之間在語法上是否有區別?使用函數是否是一種好習慣?
查看完整描述

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)

?

結論應該已經很清楚了:


不要使用函數創建小部件。


查看完整回答
反對 回復 2019-11-26
?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

調用Flutter小部件時,請確保使用const關鍵字。例如const MyListWidget();


查看完整回答
反對 回復 2019-11-26
  • 3 回答
  • 0 關注
  • 540 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號