將Container
比做成Flutter
中的div
並不恰當,但這並不妨礙前端同學用Container
做為起點來學習Flutter
。Flutter
官方的文件閱讀起來不是很直觀,對於習慣了看前端類有直觀示例的文件的同學來說不是很友好,故簡單的總結了一下,從Container
的基礎用法開始。
Container基礎用法
通過color
屬性生成一個黃色的Container
Container(
color: Colors.yellow,
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/77e1d6293b31a5b3254136c97d71d4087a226ce50c3cd6dc862cd395f4d94226.jpg)
通過margin
屬性設定這個Container
的外邊距
Container(
color: Colors.yellow,
margin: EdgeInsets.fromLTRB(100, 300, 100, 300),
)
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/0cf9ae6eb68c31b97b392266be2f5742a6c064cc2c4440cf6b3d1a16b9ee486e.jpg)
通過decoration
屬性來將這個Container
設定成圓形,注意Container
的color
屬性和decoration
屬性只能存其一,不能同時提供
Container(
margin: EdgeInsets.fromLTRB(100, 300, 100, 300),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.yellow,
),
)
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/8cacaac8c7e58ef002eeb9180ebb42c62237c02841043f162fdedfa3d9143a43.jpg)
為Container
加一個綠色的child Container
,此時child會充滿父widget的空間
Container(
color: Colors.yellow,
child: Container(
color: Colors.green,
),
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/4a30b031b3bd703889e3469f319289d3bd0838b4bed24aa0886b217eed3c6478.jpg)
為子Container
設定寬高並通過alignment
屬性使其居中:
Container(
color: Colors.yellow,
alignment: Alignment.center,
child: Container(
color: Colors.green,
width: 200,
height: 100,
),
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/c067b44822cd3190e710c780b3ee5776d32b1eee4b1ca55e57fbf70e187e0c1b.jpg)
通過margin
來使其居中
Container(
color: Colors.yellow,
child: Container(
color: Colors.green,
margin: EdgeInsets.fromLTRB(100, 300, 100, 300),
),
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/21acb89bd6fe2e1b8f064f1c0ac643c61054a41a76591601e41cd13799be628e.jpg)
加入一個文字做為其child,能看到左上角的文字嗎?
Container(
color: Colors.yellow,
child: Text(
"快狗叫車",
textDirection: TextDirection.ltr,
style: TextStyle(color: Colors.black),
),
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/bad7e37fe3df92f6c65859405053a2b599ba61ddc99b2641895c186eda443a8d.jpg)
使用alignment
屬性來設定child
widget的對齊方式,通常使用Alignment
類來設定對其方式
Container(
color: Colors.yellow,
child: Text(
"快狗叫車",
textDirection: TextDirection.ltr,
style: TextStyle(color: Colors.black),
),
alignment: Alignment.centerLeft, // Alignment.bottomRight ...
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/ade2d8c60a44d5fc2c570c4843952c0ffde55158d4ceb8e1d0a2ce5547885bab.jpg)
通過另一個Container
來包住這個Text
,並設定居中
Container(
color: Colors.yellow,
alignment: Alignment.center,
child: Container(
color: Colors.green,
child: Text(
"快狗叫車",
textDirection: TextDirection.ltr,
style: TextStyle(color: Colors.black),
),
),
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/3bd9284ca817fa16a6a9d97a23587be54d1e260374fe27eb99c15e28aa98a567.jpg)
使用padding
屬性設定一下子Container
的內邊距
Container(
color: Colors.yellow,
alignment: Alignment.center,
child: Container(
color: Colors.green,
padding: EdgeInsets.fromLTRB(100, 20, 100, 20),
child: Text(
"快狗叫車",
textDirection: TextDirection.ltr,
style: TextStyle(color: Colors.black),
),
),
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/6af09f141bc2b82074032bd1fe1f0c7c7ec36a258bf9567c0e3ae5ff003961a8.jpg)
使用transform
屬性可以進行矩陣轉換相關的設定, 通常我們都是用它來做旋轉
Container(
color: Colors.yellow,
child: Container(
color: Colors.green,
margin: EdgeInsets.fromLTRB(100, 200, 100, 300),
transform: Matrix4.rotationZ(0.2),
),
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/c7b359700c6a537a49f1d00ef1f545e3ea3eea85a2af3bde5a3ad32a0823f83f.jpg)
使用decoration
屬性還可以設定Container
的內邊距、圓角、背景圖、邊框和陰影等,主要是用於裝飾背景
Container(
color: Colors.yellow,
alignment: Alignment.center,
child: Container(
padding: EdgeInsets.fromLTRB(100, 20, 100, 20),
decoration: BoxDecoration(
// 背景色
color: Colors.green,
// 圓角
borderRadius: BorderRadius.circular(10),
// 邊框
border: Border.all(
color: Colors.black54,
width: 2,
),
// 陰影
boxShadow: [
BoxShadow(
color: Colors.pink,
blurRadius: 5.0,
),
],
// 背景圖片
image: DecorationImage(
image: NetworkImage('https://static.daojia.com/assets/project/tosimple-pic/icon-about-us_1587887989775.png'),
alignment: Alignment.centerLeft,
),
),
child: Text(
"快狗叫車",
textDirection: TextDirection.ltr,
style: TextStyle(color: Colors.black),
),
),
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/111025b0bb06d4459a50981219eca6cdaa23f71056cfd25815c5fa7fecafaa00.jpg)
decoration
與 foregroundDecoration
有點像css中::before
和::after
,區別是繪製順序不同,foregroundDecoration
可以用來裝飾前景
// 使用decoration去設定
Container(
color: Colors.yellow,
alignment: Alignment.center,
margin: EdgeInsets.all(10),
child: Container(
padding: EdgeInsets.fromLTRB(100, 20, 100, 20),
transform: Matrix4.rotationZ(0.2),
decoration: BoxDecoration(
image: DecorationImage(
image: NetworkImage('https://static.daojia.com/assets/project/tosimple-pic/icon-about-us_1587887989775.png'),
alignment: Alignment.center,
),
),
child: Text(
"快狗叫車快狗叫車",
textDirection: TextDirection.ltr,
style: TextStyle(color: Colors.black),
),
),
)
複製程式碼
// 使用foregroundDecoration去設定
Container(
color: Colors.yellow,
alignment: Alignment.center,
margin: EdgeInsets.all(10),
child: Container(
padding: EdgeInsets.fromLTRB(100, 20, 100, 20),
transform: Matrix4.rotationZ(0.2),
foregroundDecoration: BoxDecoration(
image: DecorationImage(
image: NetworkImage('https://static.daojia.com/assets/project/tosimple-pic/icon-about-us_1587887989775.png'),
alignment: Alignment.center,
),
),
child: Text(
"快狗叫車快狗叫車",
textDirection: TextDirection.ltr,
style: TextStyle(color: Colors.black),
),
),
)
複製程式碼
效果對比:
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/1f4bdb8f187b8b378403c1dabb54a7225942d10b99a2e6d34db98d01a5ffe3c3.jpg)
可以看到,使用foregroundDecoration
設定背景圖時,背景圖圖片會蓋在文字上方,使用decoration
則相反
使用constraints
來設定約束,用來約束自身,描述當前widget所允許佔用的空間大小,通常使用BoxConstraint
來設定約束條件。這裡約束了子Container
的最大和最小寬高
child Container無child的情況下,子Container
會使用約束允許的最大高度和最大寬度,
Container(
color: Colors.yellow,
alignment: Alignment.centerLeft,
child: Container(
color: Colors.green,
constraints: BoxConstraints(
maxHeight: 300,
maxWidth: 300,
minHeight: 100,
minWidth: 100
),
),
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/0d62f86cf2a8a4a801322428ace30fc9080fe0a1f7183f7a30eb5646bce3328c.jpg)
child Container有child的情況,子Container
會根據它的child的大小和約束來佈局,本例中由於Text
文字widget所佔用的空間並未達到約束規定的最小空間,即最小寬高,這裡直接按照約束中的最小寬高進行佈局
Container(
color: Colors.yellow,
alignment: Alignment.centerLeft,
child: Container(
color: Colors.green,
constraints: BoxConstraints(
maxHeight: 300,
maxWidth: 300,
minHeight: 50,
minWidth: 100
),
child: Text(
"快狗叫車",
textDirection: TextDirection.ltr,
style: TextStyle(color: Colors.black),
),
),
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/493c0a796e9acc8122f2fd1f57d2ea285bc694a2e357e141ab179f9329b73ff1.jpg)
如果將上面例子中Text
widget所需要佔用的空間變大,例如將字型變大,則Text
的父Container
按最大約束空間進行佈局
Container(
color: Colors.yellow,
alignment: Alignment.centerLeft,
child: Container(
color: Colors.green,
constraints: BoxConstraints(
maxHeight: 300,
maxWidth: 300,
minHeight: 50,
minWidth: 100
),
child: Text(
"快狗叫車",
textDirection: TextDirection.ltr,
fontSize: 300,
style: TextStyle(color: Colors.black),
),
),
);
複製程式碼
![Flutter基礎:Flutter中的div——Container](https://i.iter01.com/images/a33aab7d1125803850dfd80a95d490e97cab48d08fe65adb5876aaf309a6b748.jpg)
以上就是Container
的基本用法
參考
關注我們
![公眾號@前端論道](https://i.iter01.com/images/182d2a153924e3b151b5ff0a7bc07b13e41fb7301748baefa06dcd2122e18e19.png)