线性布局可以将子 Widget 在同一个方向(水平和垂直)上排列。
Flutter 的线性布局,有两个:

  1. Row:水平方向的线性布局
  2. Column:垂直方向的线性布局

Row 和 Column 都继承自弹性布局 Flex,其实就是确定了主轴方向的 Flex,其余的用法和 Flex 一致。

Row

Row 可以在水平方向排列其子 widget。

Row 的使用

Row 是水平排列,给其 children 参数添加子 Widget 即可,例如:

  1. Row(
  2. children: <Widget>[
  3. Text("Hello Flutter"),
  4. Image.asset(
  5. "images/flutter.png",
  6. width: 200,
  7. )
  8. ],
  9. )

Row 在一个页面使用的 Demo 代码如下:

  1. import 'package:flutter/material.dart';
  2. void main() => runApp(RowWidget());
  3. class RowWidget extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. return MaterialApp(
  7. title: "Flutter Demo",
  8. theme: ThemeData(
  9. primaryColor: Colors.blue,
  10. ),
  11. home: Scaffold(
  12. appBar: AppBar(title: Text("Flutter布局Widget -- 线性布局")),
  13. body: Row(
  14. children: <Widget>[
  15. Text("Hello Flutter"),
  16. Image.asset(
  17. "images/flutter.png",
  18. width: 200,
  19. )
  20. ],
  21. ),
  22. ),
  23. );
  24. }
  25. }

运行效果:

Flutter 学习(二十二)线性布局 - 图1

Row 的 children 有两个,分别是 Text 和 Image,这两个按照水平方向排列。

Row 的构造函数及参数说明

Row 的构造函数为:

  1. class Row extends Flex {
  2. Row({
  3. Key key,
  4. MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
  5. MainAxisSize mainAxisSize = MainAxisSize.max,
  6. CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
  7. TextDirection textDirection,
  8. VerticalDirection verticalDirection = VerticalDirection.down,
  9. TextBaseline textBaseline,
  10. List<Widget> children = const <Widget>[],
  11. }) : super(
  12. children: children,
  13. key: key,
  14. direction: Axis.horizontal,
  15. mainAxisAlignment: mainAxisAlignment,
  16. mainAxisSize: mainAxisSize,
  17. crossAxisAlignment: crossAxisAlignment,
  18. textDirection: textDirection,
  19. verticalDirection: verticalDirection,
  20. textBaseline: textBaseline,
  21. );
  22. }
参数名字 参数类型 意义 必选 or 可选
key Key Widget 的标识 可选
mainAxisAlignment MainAxisAlignment 表示子 Widget 在主轴的对齐方式 可选
mainAxisSize MainAxisSize 表示主轴应该占用多大的空间 可选
crossAxisAlignment CrossAxisAlignment 表示子 Widget 在交叉轴的对齐方式 可选
textDirection TextDirection 表示子 Widget 在主轴方向上的布局顺序 可选
verticalDirection VerticalDirection 表示子 Widget 在交叉轴方向上的布局顺序 可选
textBaseline TextBaseline 排列子 Widget 时使用哪个基线 可选
children List< Widget> Flex 布局里排列的内容 可选

Column

Column 可以在垂直方向上排列其子 widget。

Column 的快速上手

Column 是垂直方向上排列,给其 children 参数添加子 Widget 即可,例如:

  1. Column(
  2. children: <Widget>[
  3. Text("Hello Flutter"),
  4. Image.asset(
  5. "images/flutter.png",
  6. width: 200,
  7. )
  8. ],
  9. )

Column 在一个页面使用的 Demo 代码如下:

  1. import 'package:flutter/material.dart';
  2. void main() => runApp(ColumnWidget());
  3. class ColumnWidget extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. return MaterialApp(
  7. title: "Flutter Demo",
  8. theme: ThemeData(
  9. primaryColor: Colors.blue,
  10. ),
  11. home: Scaffold(
  12. appBar: AppBar(title: Text("Flutter布局Widget -- 线性布局")),
  13. body: Column(
  14. children: <Widget>[
  15. Text("Hello Flutter"),
  16. Image.asset(
  17. "images/flutter.png",
  18. width: 200,
  19. )
  20. ],
  21. ),
  22. ),
  23. );
  24. }
  25. }

运行结果:

Flutter 学习(二十二)线性布局 - 图2

Column 的构造函数及参数说明

Column 的构造函数为:

  1. class Column extends Flex {
  2. Column({
  3. Key key,
  4. MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
  5. MainAxisSize mainAxisSize = MainAxisSize.max,
  6. CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
  7. TextDirection textDirection,
  8. VerticalDirection verticalDirection = VerticalDirection.down,
  9. TextBaseline textBaseline,
  10. List<Widget> children = const <Widget>[],
  11. }) : super(
  12. children: children,
  13. key: key,
  14. direction: Axis.vertical,
  15. mainAxisAlignment: mainAxisAlignment,
  16. mainAxisSize: mainAxisSize,
  17. crossAxisAlignment: crossAxisAlignment,
  18. textDirection: textDirection,
  19. verticalDirection: verticalDirection,
  20. textBaseline: textBaseline,
  21. );
  22. }
参数名字 参数类型 意义 必选 or 可选
key Key Widget 的标识 可选
mainAxisAlignment MainAxisAlignment 表示子 Widget 在主轴的对齐方式 可选
mainAxisSize MainAxisSize 表示主轴应该占用多大的空间 可选
crossAxisAlignment CrossAxisAlignment 表示子 Widget 在交叉轴的对齐方式 可选
textDirection TextDirection 表示子 Widget 在主轴方向上的布局顺序 可选
verticalDirection VerticalDirection 表示子 Widget 在交叉轴方向上的布局顺序 可选
textBaseline TextBaseline 排列子 Widget 时使用哪个基线 可选
children List< Widget> Flex 布局里排列的内容 可选

特殊情况

如果 Row 里面嵌套 Row,或者 Column 里面再嵌套 Column,那么只有最外面的 Row 或 Column 会占用尽可能大的空间,里面 Row 或 Column 所占用的空间为实际大小。

参考

【1】Flutter 实战
【2】Flutter 中文文档
【3】Flutter 完全手册