Row 與 Column 的父類是 Flex,代表著一維陣列的方式來排列元件,以使用 Flex 名稱的原因在於,它與 CSS3 的 Flexbox 盒模型類似,具有 main axis 與 cross axis 特性,在官方網站〈Layout in Flutter〉中有張圖示,表示了 Row、Column 的 main axis 與 cross axis:
元件會沿著 main axis 的方向依序排列,對於 Row 來說,main axis 是水平由左至右,Column 則是垂直由上至下,如果知道事先知道 main axis,通常就直接使用 Row 或 Column,而它們會儘量取得最大空間給 main axis 使用。
無論是 Row 或 Column,元件對齊預設是靠 main axis 起點,corss axis 罝中;若是 Column,就是預設垂直靠上、水平置中,例如:
import 'package:flutter/material.dart';
void main() => runApp(
Column(
children: [
Container(
color: Colors.blue,
width:100,
height: 100,
),
Container(
color: Colors.yellow,
width:100,
height: 100,
),
],
)
);
執行畫面會是:
對於 Column,若想垂直置中,可以改為:
import 'package:flutter/material.dart';
void main() => runApp(
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
color: Colors.blue,
width:100,
height: 100,
),
Container(
color: Colors.yellow,
width:100,
height: 100,
),
],
)
);
執行畫面會如下:
至於 Row,使用上類似,只不過至少得設 textDirection 特性,因為元件對齊預設是靠 main axis 起點,corss axis 罝中,對於 Row,就是水平靠左對齊、垂直置中,例如:
import 'package:flutter/material.dart';
void main() => runApp(
Row(
textDirection: TextDirection.ltr,
children: [
Container(
color: Colors.blue,
width:100,
height: 100,
),
Container(
color: Colors.yellow,
width:100,
height: 100,
),
],
)
);
執行結果如下:
如果要水平置中的話,就是將 mainAxisAlignment 設為 MainAxisAlignment.center:
import 'package:flutter/material.dart';
void main() => runApp(
Row(
textDirection: TextDirection.ltr,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
color: Colors.blue,
width:100,
height: 100,
),
Container(
color: Colors.yellow,
width:100,
height: 100,
),
],
)
);
執行結果如下:
Row 與 Column 可以構成巢狀,形成更豐富的版面結構。例如在 Column 中裝兩個 Row,每個 Row 的元件個數各不相同:
import 'package:flutter/material.dart';
void main() => runApp(
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
textDirection: TextDirection.ltr,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
color: Colors.blue,
width:100,
height: 100,
),
Container(
color: Colors.yellow,
width:100,
height: 100,
),
],
),
Row(
textDirection: TextDirection.ltr,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
color: Colors.deepOrange,
width:100,
height: 100,
),
Container(
color: Colors.cyan,
width:100,
height: 100,
),
Container(
color: Colors.green,
width:100,
height: 100,
),
],
),
],
)
);
執行結果如下:

