Flutter 之 Row、Column詳解

使用者4530184583528發表於2021-07-17

1.1 簡介

在Flutter中非常常見的一個多子節點控制元件,將children排列成一行。估計是借鑑了Web中Flex佈局,所以很多屬性和表現,都跟其相似。但是注意一點,自身不帶滾動屬性,如果超出了一行,在debug下面則會顯示溢位的提示。

1.2 佈局行為

Row的佈局有六個步驟,這種佈局表現來自Flex(Row和Column的父類):

  1. 首先按照不受限制的主軸(main axis)約束條件,對flex為null或者為0的child進行佈局,然後按照交叉軸( cross axis)的約束,對child進行調整;
  2. 按照不為空的flex值,將主軸方向上剩餘的空間分成相應的幾等分;
  3. 對上述步驟flex值不為空的child,在交叉軸方向進行調整,在主軸方向使用最大約束條件,讓其佔滿步驟2所分得的空間;
  4. Flex交叉軸的範圍取自子節點的最大交叉軸;
  5. 主軸Flex的值是由mainAxisSize屬性決定的,其中MainAxisSize可以取max、min以及具體的value值;
  6. 每一個child的位置是由mainAxisAlignment以及crossAxisAlignment所決定。

Row的佈局行為表面上看有這麼多個步驟,其實也還算是簡單,可以完全參照web中的Flex佈局,包括主軸、交叉軸等概念。

微信截圖_20210716155243.png

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,看具體的場景選擇。

相關文章