Flutter实战(8):Flutter 组件之 Row、Col
1. Flex 布局
Flex 布局是一个很经典的布局方式,简单易懂,容易上手。多尝试,知道横轴纵轴的每一个属性会布局成什么样子就掌握了。
![](https://img.haomeiwen.com/i19650943/f96b3c9bfbbf2aef.png)
2. 基本介绍
Row 和 Column 在 Flutter 里都是最常用的控件之一。后边示例需要用到 Container,需要了解的同学点这里。
代码下载地址。如果对你有帮助的话记得给个关注,代码会根据我的 Flutter 专题不断更新。
3. Row 详解
3.1 容器创建
为了方便大家理解,我这里以一个 container 容器作为底层容器承载 Row。然后加三个不同颜色的 Item 加入布局,来展示 Flex 不同属性效果。
优雅的编程,首先创建一个 row.dart 文件。这里我们给定父容器 container 固定大小,方便大家了解横轴,纵轴属性,大家也可以自行删掉 container 的 width 和 height,了解一下没有设置父容器时,自适应效果。
import 'package:flutter/material.dart';
class FMRowVC extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: Scaffold(
appBar: AppBar(
title: Text(
"Row",
),
backgroundColor: Colors.lightBlue,
),
body: Container(
width: 350,
height: 200,
color: Colors.grey,
child: _row(),
),
),
);
}
Row _row(){
return Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 80,
height: 80,
color: Colors.orange,
),
Container(
width: 80,
height: 80,
color: Colors.red,
),
Container(
width: 80,
height: 80,
color: Colors.cyan,
)
],
);
}
}
3.2 横轴(mainAxisAlignment)
3.2.1 MainAxisAlignment.start
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/0a0d0f43ef3afbdb.png)
3.2.2 MainAxisAlignment.end
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/ff658af8cdca4d4e.png)
3.2.3 MainAxisAlignment.center
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/5e83705e56caa487.png)
3.2.4 MainAxisAlignment.spaceBetween
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/38e72c59d4cbcd05.png)
3.2.5 MainAxisAlignment.spaceAround
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/af6a00363f00fb07.png)
3.2.6 MainAxisAlignment.spaceEvenly
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/7f1ae9ef1c5ed609.png)
3.3 纵轴(CrossAxisAlignment)
3.3.1 CrossAxisAlignment.start
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/ddf75410711f02f1.png)
3.3.2 CrossAxisAlignment.end
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end,
![](https://img.haomeiwen.com/i19650943/0d2f5d5298a24b81.png)
3.3.3 CrossAxisAlignment.center
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
![](https://img.haomeiwen.com/i19650943/3803c114b56d23e4.png)
3.3.4 CrossAxisAlignment.stretch
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch,
![](https://img.haomeiwen.com/i19650943/ef2b3ce42e5cac24.png)
3.3.5 CrossAxisAlignment.baseline
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.baseline,
出现如下报错
![](https://img.haomeiwen.com/i19650943/6c5cd76ea2896359.png)
CrossAxisAlignment.baseline 不可以单独使用,需要配合 textBaseline 使用,我们加上这行可以解决报错问题。
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.alphabetic,
此时报错解决了,但是没有效果。因为 baseline 属性是作用于文本的,我们在每个 Item 里均加入一个 Text 文本,看一下他们的底部对齐样式。
Row _row(){
return Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.alphabetic,
children: [
Container(
width: 80,
height: 80,
color: Colors.orange,
child: Text("测试", style: TextStyle(fontSize: 10),),
),
Container(
width: 80,
height: 80,
color: Colors.red,
child: Text("测试", style: TextStyle(fontSize: 20),),
),
Container(
width: 80,
height: 80,
color: Colors.cyan,
child: Text("测试", style: TextStyle(fontSize: 30),),
)
],
);
![](https://img.haomeiwen.com/i19650943/d04ced8450564327.jpg)
4. Column 详解
其实同为 Flex 布局,Column 和 Row 大同小异,只是 Row 为横向排列 children,Column 纵向排列 children。
4.1 容器创建
为了方便大家理解,我这里以一个 container 容器作为底层容器承载 Column。然后加三个不同颜色的 Item 加入布局,来展示 Flex 不同属性效果。
优雅的编程,首先创建一个 column.dart 文件。这里我们给定父容器 container 固定大小,方便大家了解横轴,纵轴属性,大家也可以自行删掉 container 的 width 和 height,了解一下没有设置父容器时,自适应效果。
import 'package:flutter/material.dart';
class FMColumnVC extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: Scaffold(
appBar: AppBar(
title: Text(
"Column",
),
backgroundColor: Colors.lightBlue,
),
body: Container(
width: 350,
height: 350,
color: Colors.grey,
child: _column(),
),
),
);
}
Column _column(){
return Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 80,
height: 80,
color: Colors.orange,
),
Container(
width: 80,
height: 80,
color: Colors.red,
),
Container(
width: 80,
height: 80,
color: Colors.cyan,
)
],
);
}
}
4.2 横轴(mainAxisAlignment)
4.2.1 MainAxisAlignment.start
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/77da1655c773cd08.png)
4.2.2 MainAxisAlignment.end
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/0ae2ad459575faa9.png)
4.2.3 MainAxisAlignment.center
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/c1d153c121f1f53a.png)
4.2.4 MainAxisAlignment.spaceBetween
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/4bee41617da48e41.png)
4.2.5 MainAxisAlignment.spaceAround
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/645fabef4d1b05de.png)
4.2.6 MainAxisAlignment.spaceEvenly
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/43253533529bdca5.png)
4.3 纵轴(crossAxisAlignment)
4.3.1 CrossAxisAlignment.start
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
![](https://img.haomeiwen.com/i19650943/5b3e4b634f88768e.png)
4.3.2 CrossAxisAlignment.end
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end,
![](https://img.haomeiwen.com/i19650943/f10fd212b94098c9.png)
4.3.3 CrossAxisAlignment.center
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
![](https://img.haomeiwen.com/i19650943/dccf912c7762b964.png)
4.3.4 CrossAxisAlignment.stretch
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch,
![](https://img.haomeiwen.com/i19650943/3a167155425578da.png)
4.3.5 CrossAxisAlignment.baseline
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.baseline,
CrossAxisAlignment.baseline 不可以单独使用,需要配合 textBaseline 使用,我们加上这行可以解决报错问题。和 Row 一样,具体可以查看 3.3.5 ,不做重复描述了。
Column _column(){
return Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.alphabetic,
children: [
Container(
width: 80,
height: 80,
color: Colors.orange,
child: Text("测试", style: TextStyle(fontSize: 10),),
),
Container(
width: 80,
height: 80,
color: Colors.red,
child: Text("测试", style: TextStyle(fontSize: 20),),
),
Container(
width: 80,
height: 80,
color: Colors.cyan,
child: Text("测试", style: TextStyle(fontSize: 30),),
)
],
);
![](https://img.haomeiwen.com/i19650943/40a10f975ea71c8f.png)
5.技术小结
Flex 布局是一种很经典的布局方式,多加练习不难掌握。
到这里其实大部分的页面样式都可以实现了,你可以尝试将 Row 和 Column 的 item 换成 Row 和 Column 嵌套使用,这样就可以完成多样化布局。