水平、垂直布局组件
Row
是将子组件以水平方式布局的组件, Column
是将子组件以垂直方式布局的组件。项目中 90%
的页面布局都可以通过 Row
和 Column
来实现。
将3个组件水平排列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Row( children: <Widget>[ Container( height: 50, width: 100, color: Colors.red, ), Container( height: 50, width: 100, color: Colors.green, ), Container( height: 50, width: 100, color: Colors.blue, ), ], )
|
将3个组件垂直排列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| Column( mainAxisSize: MainAxisSize.min, children: <Widget>[ Container( height: 50, width: 100, color: Colors.red, ), Container( height: 50, width: 100, color: Colors.green, ), Container( height: 50, width: 100, color: Colors.blue, ), ], )
|
在 Row
和 Column
中有一个非常重要的概念: 主轴( MainAxis
) 和 交叉轴( CrossAxis
), 主轴
就是与组件布局方向一致的轴, 交叉轴
就是与主轴方向垂直的轴。
具体到 Row
组件, 主轴
是水平方向, 交叉轴
是垂直方向。而 Column
与 Row
正好相反, 主轴
是垂直方向, 交叉轴
是水平方向。
明白了 主轴 和 交叉轴 概念, 我们来看下 mainAxisAlignment
属性, 此属性表示主轴方向的对齐方式, 默认值为 start
, 表示从组件的开始处布局, 此处的开始位置和 textDirection
属性有关, textDirection
表示文本的布局方向, 其值包括 ltr
(从左到右) 和 rtl
(从右到左), 当 textDirection = ltr
时, start
表示左侧, 当 textDirection = rtl
时, start
表示右侧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| Container( decoration: BoxDecoration(border: Border.all(color: Colors.black)), child: Row( children: <Widget>[ Container( height: 50, width: 100, color: Colors.red, ), Container( height: 50, width: 100, color: Colors.green, ), Container( height: 50, width: 100, color: Colors.blue, ), ], ), )
|
黑色边框是Row
控件的范围, 默认情况下Row
铺满父组件。
主轴对齐方式有6种
, 效果如下图:
spaceAround
和 spaceEvenly
区别是:
和主轴对齐方式相对应的就是交叉轴对齐方式 crossAxisAlignment
, 交叉轴对齐方式默认是居中。Row
控件的高度是依赖子控件高度, 因此子控件高都一样时, Row
的高和子控件高相同, 此时是无法体现交叉轴对齐方式, 修改3个颜色块高分别为50
, 100
, 150
, 这样Row
的高是150
, 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| Container( decoration: BoxDecoration(border: Border.all(color: Colors.black)), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ Container( height: 50, width: 100, color: Colors.red, ), Container( height: 100, width: 100, color: Colors.green, ), Container( height: 150, width: 100, color: Colors.blue, ), ], ), )
|
主轴对齐方式效果如下图:
mainAxisSize
表示主轴尺寸, 有 min
和 max
两种方式, 默认是 max**
。**min
表示尽可能小, max
表示尽可能大。
1 2 3 4 5 6 7
| Container( decoration: BoxDecoration(border: Border.all(color: Colors.black)), child: Row( mainAxisSize: MainAxisSize.min, ... ) )
|
黑色边框, 正好包裹子组件, 而 max
效果如下:
textDirection
表示子组件主轴布局方向, 值包括 ltr
(从左到右) 和 rtl
(从右到左)
1 2 3 4 5 6 7 8 9
| Container( decoration: BoxDecoration(border: Border.all(color: Colors.black)), child: Row( textDirection: TextDirection.rtl, children: <Widget>[ ... ], ), )
|
verticalDirection
表示子组件交叉轴布局方向:
up
: 从底部开始, 并垂直堆叠到顶部, 对齐方式的 start
在底部, end
在顶部。
down
: 与 up
相反。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| Container( decoration: BoxDecoration(border: Border.all(color: Colors.black)), child: Row( crossAxisAlignment: CrossAxisAlignment.start, verticalDirection: VerticalDirection.up, children: <Widget>[ Container( height: 50, width: 100, color: Colors.red, ), Container( height: 100, width: 100, color: Colors.green, ), Container( height: 150, width: 100, color: Colors.blue, ), ], ), )
|