Flutter 尺寸限制類容器總結(jié):這可能是全網(wǎng)解析最全的一篇文章牺弄,沒有之一!

Flutter中尺寸限制類容器組件包括ConstrainedBox宜狐、UnconstrainedBox势告、SizedBox蛇捌、AspectRatio、FractionallySizedBox咱台、LimitedBox络拌、Container。這些組件可以約束子組件的尺寸回溺,下面一一介紹春贸。

ConstrainedBox

ConstrainedBox組件約束子組件的最大寬高和最小寬高,假如一個組件寬高都是300遗遵,包裹在ConstrainedBox中萍恕,并給ConstrainedBox添加最大寬高約束,用法如下:

ConstrainedBox(
  constraints: BoxConstraints(maxHeight: 60, maxWidth: 200),
  child: Container(height: 300, width: 300, color: Colors.red),
)

這時子組件是無法突破BoxConstraints設(shè)置的最大寬高车要,效果如下:

BoxConstraints的默認(rèn)值如下:

const BoxConstraints({
  this.minWidth = 0.0,
  this.maxWidth = double.infinity, //無限大
  this.minHeight = 0.0,
  this.maxHeight = double.infinity, //無限大
});

BoxConstraints提供了便捷的構(gòu)建函數(shù)允粤,方便開發(fā)者調(diào)用,如BoxConstraints.tight(Size size)BoxConstraints.expand()等翼岁。

如果BoxConstraints嵌套使用类垫,有2個ConstrainedBox,如下:

ConstrainedBox(
  constraints: BoxConstraints(maxHeight: 60, maxWidth: 200),
  child: ConstrainedBox(
    constraints: BoxConstraints(maxHeight: 100, maxWidth: 240),
    child: Container(height: 300, width: 300, color: Colors.red),
  ),
)

以最大寬為例琅坡,第一個BoxConstraints的maxHeight值是60悉患,也就是約束其子控件最大高是60,第二個BoxConstraints的maxHeight值是100榆俺,由于第二個BoxConstraints也受第一個的約束售躁,所以第二個BoxConstraints最大高也只能是60,最終子組件的最大高是60谴仙,同理最大寬是200迂求,因此多級BoxConstraints嵌套約束最大值最終值等于多個BoxConstraints約束中的最小值碾盐。同理嵌套約束最小值等于多個BoxConstraints約束中的最大值晃跺。

UnconstrainedBox

UnconstrainedBox組件不對子組件做任何約束,比如有一個父組件大小是200x200毫玖,子組件是UnconstrainedBox掀虎,UnconstrainedBox包裹一個300x300的組件,代碼如下:

Container(
  height: 200,
  width: 200,
  child: UnconstrainedBox(
    child: Container(height: 300, width: 300, color: Colors.red),
  ),
)

效果如下:

注意:黃色區(qū)域表示子控件超出父控件的區(qū)域了付枫,黃色區(qū)域只會在debug模式下存在烹玉,在release模式下,只有紅色區(qū)域阐滩。

UnconstrainedBox雖然不限制其子控件的大小二打,但仍然受父控件的約束,超出父控件的區(qū)域?qū)厝 ?/p>

UnconstrainedBox允許設(shè)置對齊方式掂榔,用法如下:

UnconstrainedBox(
  alignment: Alignment.topLeft,
  ...
)

效果如下:

和上一個圖對比继效,這次左邊和上邊沒有超出區(qū)域症杏,右邊和下邊各超出100px。

SizedBox

SizedBox是具有固定寬高的組件瑞信,直接指定具體的寬高厉颤,用法如下:

SizedBox(
  height: 60,
  width: 200,
  child: RaisedButton(
    child: Text('this is SizedBox'),
  ),
)

我們也可以設(shè)置尺寸無限大,如下:

SizedBox(
  height: double.infinity,
  width: double.infinity,
  ...
)

雖然設(shè)置了無限大凡简,子控件是否會無限長呢逼友?不,不會秤涩,子控件依然會受到父組件的約束帜乞,會擴(kuò)展到父組件的尺寸,還有一個便捷的方式設(shè)置此方式:

SizedBox.expand(
  child: RaisedButton(
    child: Text('this is SizedBox'),
  ),
)

SizedBox可以沒有子組件筐眷,但仍然會占用空間挖函,所以SizedBox非常適合控制2個組件之間的空隙,用法如下:

Column(
  children: <Widget>[
    Container(height: 30,),
    SizedBox(height: 10,),
    Container(height: 30,),
  ],
)

AspectRatio

AspectRatio組件是固定寬高比的組件浊竟,如果組件的寬度固定怨喘,希望高是寬的1/2,可以用AspectRatio實(shí)現(xiàn)此效果振定,用法如下:

AspectRatio(
  aspectRatio: 2 / 1,
  child: Container(color: Colors.red),
)

aspectRatio參數(shù)是寬高比必怜,可以直接寫成分?jǐn)?shù)的形式,也可以寫成小數(shù)的形式后频,但建議寫成分?jǐn)?shù)的形式梳庆,可讀性更高。效果如下:

FractionallySizedBox

當(dāng)我們需要一個控件的尺寸是相對尺寸時卑惜,比如當(dāng)前按鈕的寬度占父組件的70%膏执,可以使用FractionallySizedBox來實(shí)現(xiàn)此效果。

使用FractionallySizedBox包裹子控件露久,設(shè)置widthFactor寬度系數(shù)或者heightFactor高度系數(shù)更米,系數(shù)值的范圍是0-1,0.7表示占父組件的70%毫痕,用法如下:

FractionallySizedBox(
  widthFactor: .7,
  child: RaisedButton(
    child: Text('button'),
  ),
)

通過alignment參數(shù)控制子組件顯示的位置征峦,默認(rèn)為center,用法如下:

FractionallySizedBox(
  alignment: Alignment.centerLeft,
  ...
)

如果想讓2個控件之間的間隔是當(dāng)前父控件的10%消请,可以使用無子控件的FractionallySizedBox栏笆,用法如下:

Container(
  height: 200,
  color: Colors.grey,
  child: Column(
    children: <Widget>[
      Container(
        height: 50,
        color: Colors.red,
      ),
      Flexible(
        child: FractionallySizedBox(
          heightFactor: .1,
        ),
      ),
      Container(
        height: 50,
        color: Colors.blue,
      ),
    ],
  ),
)

效果如下:

LimitedBox

LimitedBox組件是當(dāng)不受父組件約束時限制它的尺寸,什么叫不受父組件約束臊泰?就像這篇文章介紹的其他組件蛉加,它們都會對子組件約束,沒有約束的父組件有ListView、Row针饥、Column等祟偷,如果LimitedBox的父組件受到約束,此時LimitedBox將會不做任何操作打厘,我們可以認(rèn)為沒有這個組件修肠,代碼如下:

Container(
  height: 100,
  width: 100,
  child: LimitedBox(
    maxHeight: 50,
    maxWidth: 100,
    child: Container(color: Colors.green,),
  ),
)

效果如下:

LimitedBox設(shè)置的寬高不是正方形,此時效果時正方形户盯,說明LimitedBox沒有起作用嵌施。

在ListView中直接添加Container組件,如下:

ListView(
  children: <Widget>[
    Container(
      color: Colors.green,
    ),
    Container(
      color: Colors.red,
    ),
  ],
)

這時你會發(fā)現(xiàn)什么也沒有莽鸭,因?yàn)樵谌萜鞑皇芗s束時吗伤,大小將會設(shè)置0,只需將Container包裹在LimitedBox中即可:

ListView(
  children: <Widget>[
    LimitedBox(
      maxHeight: 100,
      child: Container(
        color: Colors.green,
      ),
    ),
    LimitedBox(
      maxHeight: 100,
      child: Container(
        color: Colors.red,
      ),
    ),
  ],
)

效果:

Container

Container組件應(yīng)該是最常用的組件之一硫眨,Container組件可以直接設(shè)置其寬高足淆,用法如下:

Container(
  height: 100,
  width: 100,
  ...
)

Container組件是這些組件里面屬性最多的一個,當(dāng)然也是用法最復(fù)雜的一個礁阁,這里重點(diǎn)介紹Container對子組件的約束巧号,我在前面的文章中已經(jīng)詳細(xì)的介紹了Container,這里不在介紹姥闭,奉上跳轉(zhuǎn)地址:https://blog.csdn.net/mengks1987/article/details/104388393

總結(jié)

這么多約束類的容器組件丹鸿,到底要使用哪一個組件呢?總結(jié)如下:

  • ConstrainedBox:適用于需要設(shè)置最大/小寬高棚品,組件大小以來子組件大小靠欢,但不能超過設(shè)置的界限。
  • UnconstrainedBox:用到情況不多铜跑,當(dāng)作ConstrainedBox的子組件可以“突破”ConstrainedBox的限制门怪,超出界限的部分會被截取。
  • SizedBox:適用于固定寬高的情況锅纺,常用于當(dāng)作2個組件之間間隙組件掷空。
  • AspectRatio:適用于固定寬高比的情況。
  • FractionallySizedBox:適用于占父組件百分比的情況伞广。
  • LimitedBox:適用于沒有父組件約束的情況拣帽。
  • Container:適用于不僅有尺寸的約束疼电,還有裝飾(顏色嚼锄、邊框、等)蔽豺、內(nèi)外邊距等需求的情況区丑。

原文作者:老孟

原文鏈接:全網(wǎng)最詳細(xì)的一篇Flutter 尺寸限制類容器總結(jié)

來源:思否

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沧侥,更是在濱河造成了極大的恐慌可霎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宴杀,死亡現(xiàn)場離奇詭異癣朗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旺罢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門旷余,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扁达,你說我怎么就攤上這事正卧。” “怎么了跪解?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵炉旷,是天一觀的道長。 經(jīng)常有香客問我叉讥,道長窘行,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任图仓,我火速辦了婚禮抽高,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘透绩。我一直安慰自己翘骂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布帚豪。 她就那樣靜靜地躺著碳竟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狸臣。 梳的紋絲不亂的頭發(fā)上莹桅,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音烛亦,去河邊找鬼诈泼。 笑死,一個胖子當(dāng)著我的面吹牛煤禽,可吹牛的內(nèi)容都是我干的铐达。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼檬果,長吁一口氣:“原來是場噩夢啊……” “哼瓮孙!你這毒婦竟也來了唐断?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤杭抠,失蹤者是張志新(化名)和其女友劉穎脸甘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偏灿,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丹诀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翁垂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忿墅。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沮峡,靈堂內(nèi)的尸體忽然破棺而出疚脐,到底是詐尸還是另有隱情,我是刑警寧澤邢疙,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布棍弄,位于F島的核電站,受9級特大地震影響疟游,放射性物質(zhì)發(fā)生泄漏呼畸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一颁虐、第九天 我趴在偏房一處隱蔽的房頂上張望蛮原。 院中可真熱鬧,春花似錦另绩、人聲如沸儒陨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹦漠。三九已至,卻和暖如春车海,著一層夾襖步出監(jiān)牢的瞬間笛园,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工侍芝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留研铆,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓州叠,卻偏偏與公主長得像棵红,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子留量,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容