Row/Col
Row与Col都有这些属性,使用起来只是方向不同
MainAxisSize
主轴的可用空间大小
- min:主轴上可以分配的最小空间,由子元素的布局约束决定
- max:主轴上可以分配的最大空间
mainAxisAlignment and crossAxisAlignment
对于行,主轴水平运行,横轴垂直运行。对于列,主轴垂直运行,横轴水平运行。
mainAxisAlignment
假设TextDirection是ltr(文字从左向右读)
- start: 居左
- end:居右
- center:居中
- spaceBetween:将主轴方向上的空白区域均分,使得children之间的空白区域相等,首尾child都靠近首尾,没有间隙;
- spaceAround:将主轴方向上的空白区域均分,使得子元素之间的空白区域相等,但是首尾child的空白区域为1/2
- spaceEvenly:将主轴方向上的空白区域均分,使得children之间的空白区域相等,包括首尾child;
crossAxisAlignment
假设VerticalDirection是down
- start: 居上
- end:居下
- center:居中
- stretch:让children填满竖轴方向
- baseline:使得children的baseline对齐,在对齐文字时候比较游泳。尤其是一行中有不同大小的文字,那么可以使用baseline对齐.
Stack
Stack可以理解为Material风格在z轴方向的堆叠 下面是三个不同大小颜色的SizeBox层叠。
return Stack(
alignment: _alignmentDirectional,
children: <Widget>[
SizedBox(
width: 300.0,
height: 300.0,
child: Container(
color: Colors.green,
),
),
SizedBox(
width: 200.0,
height: 200.0,
child: Container(
color: Colors.yellow,
),
),
SizedBox(
width: 100.0,
height: 100.0,
child: Container(
color: Colors.red,
),
),
],
);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Expanded
Expanded组件可以使Row、Column、Flex等子组件在其主轴方向上展开并填充可用空间(例如,Row在水平方向,Column在垂直方向)。如果多个子组件展开,可用空间会被其flex factor(表示扩展的速度、比例)分割。
Expanded组件必须用在Row、Column、Flex内,并且从Expanded到封装它的Row、Column、Flex的路径必须只包括StatelessWidgets或StatefulWidgets组件(不能是其他类型的组件,像RenderObjectWidget,它是渲染对象,不再改变尺寸了,因此Expanded不能放进RenderObjectWidget)。
Widget _buildContent() {
return Container(
child: Column(
children: [
_buildBox(points: 16, color: Colors.red),
Expanded(
flex: 16,
child: Row(
children: [
_buildBox(points: 8, color: Colors.indigo),
Expanded(
flex: 8,
child: Column(
children: [
Expanded(
flex: 4,
child: Row(
children: [
Expanded(
flex: 2,
child: Column(
children: [
_buildBox(points: 1, color: Colors.green),
_buildBox(points: 1, color: Colors.blue),
],
),
),
_buildBox(points: 2, color: Colors.brown),
],
),
),
_buildBox(points: 4, color: Colors.purple),
],
),
),
],
),
),
],
),
);
}
Widget _buildBox({int points, Color color, Color textColor = Colors.white}) {
return Expanded(
flex: points,
child: Container(
constraints: BoxConstraints.expand(),
color: color,
child: Center(
child: Text(
'$points',
style: TextStyle(fontSize: 32.0, color: textColor),
),
),
),
);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
参考资料
- https://flutterchina.club/tutorials/layout/#common-layout-widgets