在〈Widget 概覽〉中使用過 Container
,或許你用過其他 UI 框架,當中也有名為 Container 的元件,通常(實現了 Composite 模式)用來管理一組元件,不過 Flutter 中的 Container
跟它們不同,只容納「一個」元件。
可以把 Flutter 中的 Container
想成是個盒子,本身也是個 Widget
,Container
直接繼承 StatelessWidget
:
Widget > StatelessWidget > Container
Container
本身其實也是個可視元件,例如,來個全紅的 Container
,底下這個範例執行後,整個螢幕會被紅色填滿:
import 'package:flutter/material.dart';
void main() => runApp(
Container(
color: Colors.red,
)
);
Container
裏頭只能放一個 Widget
,使用 Container
的目的,通常就是為了對該 Widget
做些裝飾、排列,設定尺寸、約束、邊框(border)、邊距(margin)或墊充(padding)。
有關於邊距、邊框、墊充,官方網站〈Layouts in Flutter〉中有張圖:
例如,來建立一個最大 300 x 300 的 Container
,包含邊框、墊充等設定:
import 'package:flutter/material.dart';
void main() => runApp(
Center(
child: Container(
child: Container(color: Colors.red), // 內裝背景紅色元件
alignment: Alignment.center, // 內裝元件置中對齊
decoration: BoxDecoration( // 裝飾內裝元件
color: Colors.green, // 綠色背景
border: Border.all(width: 10, color: Colors.blue), // 藍色邊框
),
padding: const EdgeInsets.all(20), // 墊充
constraints: BoxConstraints( // 容器的尺寸約束
maxWidth: 300,
maxHeight: 300,
),
)
)
);
因為作為根的 Widget
會被填滿整個螢幕,為了令 Container
的 constraints
能起作用,將之置於 Center
中,constraints
設定的大小會包含邊框、墊充。
範例中的內裝元件只是另一個設定為紅色的 Container
,沒有設定 constraints
、decoration
、padding
等,因此預設會填滿整個 Container
,執行結果如下:
Container
的 padding
、margin
,都是使用 EdgeInsetsGeometry
實例來設定,EdgeInsets
提供了一些便捷的 static
方法,all
表示四邊都設定相同的值,其他還有 EdgeInsets.only
、EdgeInsets.symmetric
等,可以查詢一下 EdgeInsets
的 API 文件,來認識一下各設定之意義。
Container
還有個特別功能,可以透過 transform
指定矩陣運算來變形。例如依序繞 X、Y、Z 軸旋轉後平移:
import 'package:flutter/material.dart';
void main() {
Matrix4 m = Matrix4.translationValues(-50, 150, 0);
m.multiply(Matrix4.rotationZ(-.5)); // 單位:徑度
m.multiply(Matrix4.rotationY(1));
m.multiply(Matrix4.rotationX(1));
runApp(
Center(
child: Container(
child: Text('哈囉,世界!',
textDirection: TextDirection.ltr,
style: TextStyle(fontSize: 40),
), // 內裝元件
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.green,
),
constraints: BoxConstraints(
maxWidth: 300,
maxHeight: 300,
),
transform: m,
)
)
);
}
座標原點是螢幕左上角,往右為正 X 軸,往下為正 Y 軸,深度為正 Z 軸,也就是採用的是右手座標,Matrix4
的運算採用的是後乘,簡單來說,想想看你想寫繞 X、Y、Z 軸旋轉後平移的矩陣公式,會是這麼寫:
[平移] * [旋轉 Z] * [旋轉 Y] * [旋轉 X] * [目標]
程式碼的撰寫時相乘順序就是依序這麼寫,範例的執行結果如下: