主軸和縱軸
對於線性布局,有主軸和縱軸之分,如果布局是沿水平方向,那么主軸是指水平方向,縱軸為垂直方向;如果布局沿垂直方向,那么主軸就是指垂直方向,縱軸為水平方向。在線性布局中,有兩個定義對齊方式的枚舉類MainAxisAlignment和CrossAxisAlignment,分別代表主軸對齊和縱軸對齊。
Row
Row可以在水平方向排列其子widget。定義如下:
Row({ ... TextDirection textDirection, MainAxisSize mainAxisSize = MainAxisSize.max, MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start, VerticalDirection verticalDirection = VerticalDirection.down, CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center, List<Widget> children = const <Widget>[], })
textDirection:表示水平方向子widget的布局順序(是從左往右還是從右往左),默認為系統當前Locale環境的文本方向。
mainAxisSize:表示Row在主軸方向占用的空間,默認是MainAxisSize.max,表示盡可能多的占用水平方向的空間,此時無論子widgets實際占用多少水平空間,Row的寬度始終等於水平方向的最大寬度;而MainAxisSize.min 表示盡可能少的占用水平空間,當子widgets沒有占滿水平剩余空間,則Row的實際寬度等於所有子widgets占用的水平空間;
MainAxisAlignment:表示子widgets在Row所占用的水平空間內對齊方式,如果MainAxisSize值為MainAxisSize.min,則此屬性無意義,因為子widgets的寬度等於Row的寬度。只有當MainAxisSize的值為MainAxisSize.max時,此屬性才有意義,MainAxisAlignment.start表示沿textDirection的初始方向對齊,如textDirection取值為textDirection.ltr時,則MainAxisAlignment.start表示左對齊,textDirection取值為TextDirection.rtl
時表示從右對齊。而MainAxisAlignment.end
和MainAxisAlignment.start
正好相反;MainAxisAlignment.center
表示居中對齊。讀者可以這么理解:textDirection是mainAxisAlignment的參考系。
verticalDirection:表示Row縱軸(垂直)的對齊方向,默認是verticalDirection.down,表示從上到下。
crossAxisAlignment:表示子widgets在縱軸方向的對齊方式,Row的高度等於子widgets中最高的子元素高度,它的取值和MainAxisAlignment一樣(包含start、end、center三個值),不同的是crossAxisAlignment的參考是verticalDirection,即verticalDirection值為verticalDirection值為verticalDirection.down時,crossAxisAlignment.start指頂部對齊,verticalDirection值為verticalDirection.up時,crossAxisAlignment.start指底部對齊。
Column
參數和Row一樣,不同的是布局方向是垂直,主軸縱軸正好相反,可類比Row來理解。
注意:如果Row里面嵌套Row,或者Column里面嵌套Column,那么只有對最外面的Row或Column會占用盡可能大的空間,里面的所占空間為實際大小。