先來看看本文的目錄,如下圖所示:

本文目錄

在原生Android開發(fā)中,我們經常會用LinearLayout來達到水平或垂直方向的布局,在Flutter中有兩個常用的組件也能夠做到類似的效果,分別是Row和Column組件,Row組件主要功能是處理水平方向的布局,Column組件主要功能是處理垂直方向的布局。下文會具體講解在Flutter中如何使用Row和Column組件實現(xiàn)LinearLayout效果,以及兩者之間的對比,方便大家對比學習。

LinearLayout 里面的android:orientation="horizontal”屬性相當于Row組件,LinearLayout 里面的 android:orientation="vertical”屬性相當于Column組件。
Flutter和LinearLayout的對比圖示如下:

安卓的orientation屬性在Flutter中的體現(xiàn)
Row的使用示例代碼如下所示:

Row的使用示例代碼
Column的使用示例代碼如下所示:

Column的使用示例代碼
Flutter中的Row以及Column使用效果圖如下所示:
Flutter中的Row以及Column使用效果圖
這里是Android里面的使用(由于Flutter效果和Android的是一樣的,后文的安卓效果圖就不再展示了)
Android里面的使用

LinearLayout 里面的android:layout_width="wrap_content"或者 android:layout_height="wrap_content"屬性相當于Row/Column組件里面的MainAxisSize.min屬性。
LinearLayout 里面的android:layout_width="match_parent"或者android:layout_height="match_parent"屬性相當于Row/Column組件里面的MainAxisSize.max屬性。Row/Column組件如果沒有設置mainAxisSize屬性,默認為max屬性值。第二小節(jié)中的Row/Column組件我們并沒有設置mainAxisSize屬性,但是我們可以看到它的效果是MainAxisSize.max 屬性的效果(Row自動填充寬為屏幕的寬,Column自動填充高為屏幕的高)。
Flutter和LinearLayout的對比圖示如下:
Flutter和LinearLayout的對比圖
Flutter使用圖解如下:
Flutter中使用 MainAxisSize.max 效果圖
Flutter中使用 MainAxisSize.min 效果圖

這個是最復雜的,需要重點掌握。gravity屬性在Android里面是用于指定控件本身或子控件的對齊屬性。在Flutter中我們可以使用Row/Column組件的MainAxisAlignment以及CrossAxisAlignment實現(xiàn)控件的對齊效果。

MainAxisAlignment是設置主軸方向的對齊方式。如果我們給Row組件設置MainAxisAlignment屬性,那么它的主軸為水平方向。如果我們給Column組件設置MainAxisAlignment屬性,那么它的主軸為垂直方向。
MainAxisAlignment有6個屬性值,默認值為start,分別是:
1、MainAxisAlignment.start,將子控件放在主軸的起始位置。2、MainAxisAlignment.end,將子控件放在主軸末尾。3、MainAxisAlignment.center,將子控件放在主軸中間位置。
下面這三個屬性需要特別關注一下:
// 將主軸方向上的空白區(qū)域等分,使得子控件之間的空白區(qū)域相等,// 兩端的子控件都靠近首尾,沒有間隙。4、MainAxisAlignment.spaceBetween// 將主軸方向上的空白區(qū)域等分,使得子控件之間的空白區(qū)域相等,// 兩端的子控件都靠近首尾,首尾子控件的空白區(qū)域為1/2。5、MainAxisAlignment.spaceAround// 將主軸方向上的空白區(qū)域等分,使得子控件之間的空白區(qū)域相等,包括首尾。6、MainAxisAlignment.spaceEvenly

CrossAxisAlignment是設置交叉軸方向的對齊方式,比如當前給Row組件設置CrossAxisAlignment屬性,那么它的交叉軸為垂直方向。如果我們給Column組件設置CrossAxisAlignment屬性,那么它的交叉軸為水平方向。
CrossAxisAlignment有5個屬性值,默認值為center,分別是:
CrossAxisAlignment.start, 子控件顯示在交叉軸的起始位置。CrossAxisAlignment.end, 子控件顯示在交叉軸的末尾位置。CrossAxisAlignment.center, 子控件顯示在交叉軸的中間位置。CrossAxisAlignment.stretch, 子控件完全填充交叉軸方向的空間。CrossAxisAlignment.baseline, 讓子控件的baseline在交叉軸方向對齊。
具體的示例如下:
(1)Row的子組件對齊
下面這個是Row的子組件對齊的示例:
示例中設置的主軸的屬性值是:MainAxisAlignment.spaceEvenly,交叉軸的屬性值是:CrossAxisAlignment.end

Row的子組件對齊示例代碼
使用圖示如下圖所示:
Row的子組件對齊效果圖
(2)Column的子組件對齊
下面這個是Column的子組件對齊的示例:
示例中設置的主軸的屬性值是:MainAxisAlignment.spaceEvenly,交叉軸的屬性值是:CrossAxisAlignment.end

Column的子組件對齊示例代碼
使用圖示如下圖所示:
Column的子組件對齊效果圖

在Android中l(wèi)ayout_weight是LinearLayout里面的屬性,它是用來給子設置權重的,表示給子按照設置的比例去分配空間。在Flutter中我們可以使用Expanded 包裹Row或Column組件,使用Expanded 組件里面的flex屬性去實現(xiàn)同樣的效果。
先來看看Row是會如何給子設置權重的,示例代碼如下所示:

Row給子設置權重示例代碼
上例中我寫了一個Row,里面有3個并排的Icon組件,權重分別是1、2、5,為了好區(qū)分,我給每個Icon加了不同的背景顏色。為了代碼更優(yōu)雅,我封裝了一個buildIcon(IconData icon, {int flex = 1, Color color})函數(shù),IconData是必須傳入的參數(shù); 參數(shù)2是權重,默認值為1; 參數(shù)3是組件的背景顏色,參數(shù)2和參數(shù)3是可選參數(shù),可以根據(jù)需要進行傳入。
我們看看效果圖,如圖所示:
效果圖
同理,我們只需要把上例中的 new Row替換成new Column就可以實現(xiàn)垂直方向設置權重,如上圖右邊所示。

在Flutter中的Row或Column中關于direction有2個需要掌握的屬性,分別是:textDirection 以及verticalDirection。其中textDirection屬性在Row組件中起到很大作用,verticalDirection屬性在Column組件中起到很大作用。
textDirection的屬性值為TextDirection.ltr,表示所有的子控件都是從左到右順序排列,這是默認值。如果為TextDirection.rtl表示從右邊開始向左邊倒序排列。
verticalDirection的屬性值為VerticalDirection.down, 表示所有的子控件都是從上到下順序排列。如果為VerticalDirection.up從底部開始向上倒序排列。
先來看看Row中是如何使用的,我們這里使用的textDirection屬性,是還是拿本章一開始的那個例子做修改,核心代碼如下所示:

Row中使用textDirection屬性
再來看看Column是如何使用的,可以看出只需要把textDirection屬性換成verticalDirection就可以了。是不是很簡單?

Column中使用verticalDirection屬性
我們看一下效果圖,如圖所示: