1.1 簡介
在Flutter中非常常見的一個多子節點控制元件,將children排列成一行。估計是借鑑了Web中Flex佈局,所以很多屬性和表現,都跟其相似。但是注意一點,自身不帶滾動屬性,如果超出了一行,在debug下面則會顯示溢位的提示。
1.2 佈局行為
Row的佈局有六個步驟,這種佈局表現來自Flex(Row和Column的父類):
- 首先按照不受限制的主軸(main axis)約束條件,對flex為null或者為0的child進行佈局,然後按照交叉軸( cross axis)的約束,對child進行調整;
- 按照不為空的flex值,將主軸方向上剩餘的空間分成相應的幾等分;
- 對上述步驟flex值不為空的child,在交叉軸方向進行調整,在主軸方向使用最大約束條件,讓其佔滿步驟2所分得的空間;
- Flex交叉軸的範圍取自子節點的最大交叉軸;
- 主軸Flex的值是由mainAxisSize屬性決定的,其中MainAxisSize可以取max、min以及具體的value值;
- 每一個child的位置是由mainAxisAlignment以及crossAxisAlignment所決定。
Row的佈局行為表面上看有這麼多個步驟,其實也還算是簡單,可以完全參照web中的Flex佈局,包括主軸、交叉軸等概念。
2. 屬性解析
MainAxisAlignment:主軸方向上的對齊方式,會對child的位置起作用,預設是start。
其中MainAxisAlignment列舉值:
- center:將children放置在主軸的中心;
- end:將children放置在主軸的末尾;
- spaceAround:將主軸方向上的空白區域均分,使得children之間的空白區域相等,但是首尾child的空白區域為1/2;
- spaceBetween:將主軸方向上的空白區域均分,使得children之間的空白區域相等,首尾child都靠近首尾,沒有間隙;
- spaceEvenly:將主軸方向上的空白區域均分,使得children之間的空白區域相等,包括首尾child;
- start:將children放置在主軸的起點;
其中spaceAround、spaceBetween以及spaceEvenly的區別,就是對待首尾child的方式。其距離首尾的距離分別是空白區域的1/2、0、1。
MainAxisSize:在主軸方向佔有空間的值,預設是max。
MainAxisSize的取值有兩種:
- max:根據傳入的佈局約束條件,最大化主軸方向的可用空間;
- min:與max相反,是最小化主軸方向的可用空間;
CrossAxisAlignment:children在交叉軸方向的對齊方式,與MainAxisAlignment略有不同。
CrossAxisAlignment列舉值有如下幾種:
- baseline:在交叉軸方向,使得children的baseline對齊;
- center:children在交叉軸上居中展示;
- end:children在交叉軸上末尾展示;
- start:children在交叉軸上起點處展示;
- stretch:讓children填滿交叉軸方向;
TextDirection:阿拉伯語系的相容設定,一般無需處理。
VerticalDirection:定義了children擺放順序,預設是down。
VerticalDirection列舉值有兩種:
- down:從top到bottom進行佈局;
- up:從bottom到top進行佈局。
top對應Row以及Column的話,就是左邊和頂部,bottom的話,則是右邊和底部。
TextBaseline:使用的TextBaseline的方式,有兩種,前面已經介紹過。
3. 使用場景
Row和Column都是非常常用的佈局控制元件。一般情況下,比方說需要將控制元件在一行或者一列顯示的時候,都可以使用。但並不是說只能使用Row或者Column去佈局,也可以使用Stack,看具體的場景選擇。