Row 與 Column


RowColumn 的父類是 Flex,代表著一維陣列的方式來排列元件,以使用 Flex 名稱的原因在於,它與 CSS3 的 Flexbox 盒模型類似,具有 main axis 與 cross axis 特性,在官方網站〈Layout in Flutter〉中有張圖示,表示了 RowColumn 的 main axis 與 cross axis:

Row 與 Column

元件會沿著 main axis 的方向依序排列,對於 Row 來說,main axis 是水平由左至右,Column 則是垂直由上至下,如果知道事先知道 main axis,通常就直接使用 RowColumn,而它們會儘量取得最大空間給 main axis 使用。

無論是 RowColumn,元件對齊預設是靠 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,
      ),
    ],
  )
);

執行畫面會是:

Row 與 Column

對於 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 與 Column

至於 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,
      ),
    ],
)
);

執行結果如下:

Row 與 Column

如果要水平置中的話,就是將 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

RowColumn 可以構成巢狀,形成更豐富的版面結構。例如在 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,
          ),
        ],
      ),
    ],
  )
);

執行結果如下:

Row 與 Column