Flutter之Container用法詳解

最近開始接觸Flutter斥黑,網(wǎng)上對Flutter評價很高揖盘,加上是谷歌這種大公司研發(fā)推廣的,決定先入坑锌奴。

廢話不多說兽狭,直奔主題!學習框架鹿蜀,首先要將里面常用控件熟練使用箕慧,后面可以逐步深入、究其原理茴恰。

前言

相關文章:Flutter學習目錄

github地址:Flutter學習

文章結(jié)構(gòu)

  • Color Property
  • Child Property
  • Alignment Property
  • Constraints Property
  • Margin Property
  • Padding Property
  • Decoration Property
  • ForegroundDecoration Property
  • Transform Property

介紹

Container類似于iOS中的UIView颠焦,具有繪制定位往枣、調(diào)整大小功能伐庭。通常用來裝載其它子控件粉渠,假如Container沒有子控件,它將自動填充整個屏幕圾另;反之霸株,會根據(jù)子控件大小,調(diào)整自身大小集乔,從而達到自適應效果去件。

注意:

使用Container時,通常要有一個父控件扰路,一般情況下不單獨使用Container尤溜。常用的父控件有Center widget、Padding Widget幼衰、Column Widget靴跛、Row Widget、Scaffold Widget渡嚣。

一梢睛、Color Property

這個屬性用于設置Container的背景顏色,類似于iOS中的UIView的backgroundColor识椰。使用如下:

  • Colors Class
//Container顏色屬性之Colors
class Color_Property_Colors extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
        child: Container(
          //color: Colors.green,//正常顏色
          //color:Colors.green[200],//帶有陰影(相當于是透明度)
          color: Colors.green.shade200,//同上
        ),
    );
  }
}

呈現(xiàn)效果如下:


圖1 Container之Colors屬性
  • Color Class
//Container顏色屬性之Color
class Color_Property_Color extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        //color: Color(0xFFFFFFFF),//一定是8位,否則報錯
        //color: Color.fromARGB(255, 66, 165, 245),
        color: Color.fromRGBO(66, 165, 245, 1.0),//作用同上
      ),
    );
  }
}

呈現(xiàn)效果如下:


圖2 Container之Color屬性
注意:

1绝葡、使用8位16進制而不是6位
2、.fromARGB含義
A = Alpha or opacity, R = Red, G = Green, B = Blue
3腹鹉、.fromRGBO含義
R = Red, G = Green, B = Blue, O = Opacity

二藏畅、Child Property

如前言所述,如果Container里面沒有子控件功咒,它就會填充整個屏幕愉阎;如果有子控件,Container就會自動適應子控件大小力奋。
另外榜旦,Container只能容納一個子控件,如果想容納更多的子控件,可以將子控件設置為Row景殷、Column溅呢、Stack(這三個子控件都有一個children屬性)

  • 添加子控件
//Container屬性之Child
class Child_Property extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromRGBO(66, 165, 245, 1.0),
        child: Text("Flutter Cheatsheet"),
      ),
    );
  }
}

呈現(xiàn)效果如下:


圖3 添加子控件

三、Alignment Property

Alignment屬性主要是針對于Container內(nèi)部的子控件布局猿挚。
主要有以下幾個屬性:Alignment咐旧、FractionalOffset、AlignmentDirectional

  • Alignment
    代碼如下:
//Container屬性之Alignment
class Alignment_Property extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        child: Text("Flutter Cheatsheet",
             style: TextStyle(
               fontSize: 30.0
             ),
        ),
        //不加這句話绩蜻,Container會自適應child大小;加上以后會充滿屏幕
        //alignment: Alignment(0.0, 0.0),
        alignment: Alignment.center,//等價于上面
      ),
    );
  }
}

效果如下:


圖4 Container屬性之Alignment

Alignment坐標系圖如下:


圖5 Alignment坐標系

常用等價屬性:
Alignment.bottomCenter 對應 Alignment(0.0, 1.0)
Alignment.bottomLeft 對應 Alignment(-1.0, 1.0)
Alignment.bottomRight 對應 Alignment(1.0, 1.0)
Alignment.center 對應 Alignment(0.0, 0.0)
Alignment.centerLeft 對應 Alignment(-1.0, 0.0)
Alignment.centerRight 對應 Alignment(1.0, 0.0)
Alignment.topCenter 對應 Alignment(0.0, -1.0)
Alignment.topLeft 對應 Alignment(-1.0, -1.0)
Alignment.topRight 對應 Alignment(1.0, -1.0)

  • FractionalOffset
    這個屬性跟上面講的Alignment非常相似铣墨,唯一的不同就是坐標系:
    Alignment坐標系是X:-1.0--1.0;Y:-1.0--1.0,
    FractionalOffset坐標系是X:0.0--1.0办绝,Y:0.0--1.0伊约。

FractionalOffset坐標系圖如下:

圖6 FractionalOffset坐標系

代碼如下:

//Container屬性之FractionalOffset
class Alignment_FractionalOffset extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        child: Text("Flutter Cheatsheet",
          style: TextStyle(
              fontSize: 30.0
          ),
        ),
        //不加這句話词顾,Container會自適應child大小;加上以后會充滿屏幕
        //alignment: FractionalOffset(0.5, 0.5),
        alignment: FractionalOffset.center,//等價于上面
      ),
    );
  }
}

常用等價屬性如下
FractionalOffset.bottomCenter 對應 FractionalOffset(0.5, 1.0)
FractionalOffset.bottomLeft 對應 FractionalOffset(0.0, 1.0)
FractionalOffset.bottomRight 對應 FractionalOffset(1.0, 1.0)
FractionalOffset.center 對應 FractionalOffset(0.5, 0.5)
FractionalOffset.centerLeft 對應 FractionalOffset(0.0, 0.5)
FractionalOffset.centerRight 對應 FractionalOffset(1.0, 0.5)
FractionalOffset.topCenter 對應 FractionalOffset(0.5, 0.0)
FractionalOffset.topLeft 對應 FractionalOffset(0.0, 0.0)
FractionalOffset.topRight 對應 FractionalOffset(1.0, 0.0)

  • AlignmentDirectional
    說到這個屬性,就要提到一個小插曲:
    網(wǎng)上說AlignmentDirectional有2個坐標系碱妆,是因為TextDirection.ltr和TextDirection.rtl,但是經(jīng)過本人的親身實驗昔驱,這種觀點是不對的疹尾,不知道是不是由于官方官方框架更新的原。
    最終結(jié)論:這個屬性跟Alignment用法是完全一樣(既然完全一樣骤肛,何必多此一舉呢?)纳本。

坐標系圖如下:


圖7 AlignmentDirectional坐標系

代碼如下:

//Container屬性之AlignmentDirectional
class Alignment_AlignmentDirectional extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        child: Text("Flutter",
          style: TextStyle(
              fontSize: 15.0
          ),
          //textDirection: TextDirection.ltr,//正常,從左向右(不影響alignment)
          textDirection: TextDirection.ltr,//從右向左(不影響alignment)
        ),
        //不加這句話,Container會自適應child大小;加上以后會充滿屏幕
        alignment:AlignmentDirectional(-1.0, 1.0),
        //alignment: AlignmentDirectional.bottomStart,//等價于上面
      ),
    );
  }
}

常用等價屬性:
AlignmentDirectional.bottomCenter 對應 AlignmentDirectional(0.0, 1.0)
AlignmentDirectional.bottomEnd 對應 AlignmentDirectional(1.0, 1.0)
AlignmentDirectional.bottomStart 對應 AlignmentDirectional(-1.0, 1.0)
AlignmentDirectional.center 對應 AlignmentDirectional(0.0, 0.0)
AlignmentDirectional.centerEnd 對應 AlignmentDirectional(1.0, 0.0)
AlignmentDirectional.centerStart 對應 AlignmentDirectional(-1.0, 0.0)
AlignmentDirectional.topCenter 對應 AlignmentDirectional(0.0, -1.0)
AlignmentDirectional.topEnd 對應 AlignmentDirectional(1.0, -1.0)
AlignmentDirectional.topStart 對應 AlignmentDirectional(-1.0, -1.0)

四腋颠、Constraints Property

布局屬性繁成,主要講的是怎么確定控件的大小淑玫;其中經(jīng)常使用的就是BoxConstraint巾腕。BoxConstraint包含minWidth、maxWidth絮蒿、minHeight尊搬、maxHeight,詳細介紹如下:

  • Container無子控件(場景1)
    代碼如下:
//Container屬性之Constraints Property
class Constraints_Property extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        alignment: AlignmentDirectional(0.0, 0.0),
        child: Container(
          color: Colors.green,
          constraints: BoxConstraints(
            maxHeight: 300,
            maxWidth: 200,
            minWidth: 150,
            minHeight: 150,
          ),
        ),
      ),
    );
  }
}

呈現(xiàn)效果如下:


圖8 Container之Constraints無子控件

前面說過如果Container沒有子控件土涝,Container將填充整個屏幕佛寿,但是這里設置maxHeight、maxWidth但壮。

  • Container有子控件(場景2)
    代碼如下:
//Container屬性之Constraints(有子控件)
class Constraints_Property_HasChild extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        alignment: AlignmentDirectional(0.0, 0.0),
        child: Container(
          color: Colors.green,
          child: Text("Flutter"),
          constraints: BoxConstraints(
            maxHeight: 300,
            maxWidth: 200,
            minWidth: 150,
            minHeight: 150,
          ),
        ),
      ),
    );
  }
}

呈現(xiàn)效果如下:


圖9 Container之Constraints有子控件

這里雖然有一個子控件冀泻,Container會調(diào)整自身大小來適應內(nèi)部子控件,但是由于設置了min-width和min-height蜡饵。所以Container不會完全和子控件一樣大弹渔,除非子控件尺寸大于min-width和min-height。

嘗試更改子控件大小验残,代碼如下:

//Container屬性之Constraints(有子控件)
class Constraints_Property_HasChild extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        alignment: AlignmentDirectional(0.0, 0.0),
        child: Container(
          color: Colors.green,
          //child: Text("Flutter"),
          child: Text("Flutter Cheatsheet Flutter Cheatsheet"),
          constraints: BoxConstraints(
            maxHeight: 300,
            maxWidth: 200,
            minWidth: 150,
            minHeight: 150,
          ),
        ),
      ),
    );
  }
}

呈現(xiàn)效果圖如下:


圖10 Container之Constraints有子控件

從上面這張圖可以看出Container不能超出max-width和max-height捞附。

  • Container有子控件(場景3)
    當Container有子控件,我們想讓Container不去適應子控件您没,而是充滿整個屏幕或父控件鸟召,怎么辦?
    答案就是使用BoxConstraints.expand()。
    代碼如下:
//Container屬性之Constraints(有子控件寓辱、充滿整個屏幕)
class Constraints_Property_HasChild_AllScreen extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        alignment: AlignmentDirectional(0.0, 0.0),
        child: Container(
          color: Colors.green,
          //child: Text("Flutter"),
          child: Text("Flutter"),
          constraints: BoxConstraints.expand(),
        ),
      ),
    );
  }
} 

呈現(xiàn)效果如下:


圖11 Container之Constraints有子控件

此時發(fā)現(xiàn)Container是充滿整個屏幕的康嘉,我們也可以限制充滿屏幕大小,比如說1/2寬跟继、1/3高等种冬。

五、Margin Property

跟前端的css類似舔糖,這個Margin指的是相鄰控件之間的距離娱两,主要是用EdgeInsets。

  • EdgeInsets.all()
  • EdgeInsets.symmetric()
  • EdgeInsets.fromLTRB()
  • EdgeInsets.only()

詳細如下:

  • EdgeInsets.all()
    代碼如下:
//EdgeInsets.all()
class Margin_Property_EdgeInsets_all extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        alignment: AlignmentDirectional(0.0, 0.0),
        child: Container(
          color: Colors.green,
          margin: EdgeInsets.all(20.0),
        ),
      ),
    );
  }
}

呈現(xiàn)效果如下:


圖12 Margin之EdgeInsets.all
  • EdgeInsets.symmetric()
    這個主要用于添加垂直和水平方向上的約束金吗。
    代碼如下:
//EdgeInsets.symmetric()
class Margin_Property_EdgeInsets_symmetric extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        alignment: AlignmentDirectional(0.0, 0.0),
        child: Container(
          color: Colors.green,
          margin: EdgeInsets.symmetric(
            vertical: 20.0,
            horizontal: 50.0,
          ),
        ),
      ),
    );
  }
}

呈現(xiàn)效果如下:


圖13 Margin之EdgeInsets. symmetric
  • EdgeInsets.fromLTRB()
    這個主要設置left, top, right,bottom邊距十兢。
    代碼如下:
//EdgeInsets.fromLTRB()
class Margin_Property_EdgeInsets_fromLTRB extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        alignment: AlignmentDirectional(0.0, 0.0),
        child: Container(
          color: Colors.green,
          margin: EdgeInsets.fromLTRB(20.0, 30.0, 40.0, 50.0)
        ),
      ),
    );
  }
}

呈現(xiàn)效果:


圖14 Margin之EdgeInsets. fromLTRB
  • EdgeInsets.only()
    用于設置哪些是非零的,不設置默認是零摇庙。
    代碼如下:
//EdgeInsets.only()
class Margin_Property_EdgeInsets_only extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        alignment: AlignmentDirectional(0.0, 0.0),
        child: Container(
            color: Colors.green,
            margin: EdgeInsets.only(
              left: 20.0,
              bottom: 40.0,
              top: 50.0,
            )
        ),
      ),
    );
  }
}

呈現(xiàn)效果如下:


圖15 Margin之EdgeInsets.only

六旱物、Padding Property

這個用于設置主控件內(nèi)部子控件之間的間距。和Margin一樣卫袒,利用到EdgeInsets宵呛。
代碼如下:

//EdgeInsets.all
class Padding_Property_EdgeInsets_all extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Color.fromARGB(255, 66, 165, 245),
        alignment: AlignmentDirectional(0.0, 0.0),
        child: Container(
          margin: EdgeInsets.only(
            left: 20.0,
            bottom: 40.0,
            top: 50.0,
          ),
          padding: EdgeInsets.all(10.0),//設置內(nèi)部Text控件邊距
          color: Colors.green,
          child: Text("Flutter Cheatsheet"),
          //不設置這個Container和子控件一樣大小、這樣margin設置也就沒有意義了
          constraints: BoxConstraints.expand(),
        ),
      ),
    );
  }
}

呈現(xiàn)效果如下:


圖16 Padding之EdgeInsets.all

七夕凝、Decoration Property

  • BoxDecoration Class
  • FlutterLogoDecoration Class
  • ShapeDecoration Class
  • UnderlineTabIndicator Class
    由于涉及篇幅較長宝穗,后續(xù)會重新文章詳細講解,敬請關注码秉。

八讽营、ForegroundDecoration Property

  • BoxDecoration Class
  • FlutterLogoDecoration Class
  • ShapeDecoration Class
  • UnderlineTabIndicator Class
    由于涉及篇幅較長,后續(xù)會重新文章詳細講解泡徙,敬請關注

九橱鹏、Transform Property

在Container屬性中添加transform屬性,并使用Matrix類設置transform的值堪藐,即可達到各種變換效果莉兰,代碼如下:

//Transform Property
class Transform_Property extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Color.fromARGB(255, 66, 165, 245),
      alignment: AlignmentDirectional(0.0, 0.0),
      child: Container(
        padding: EdgeInsets.all(40.0),
        color: Colors.green,
        child: Text("Flutter Cheatsheet"),  
        transform: Matrix4.rotationZ(0.5),
      ),
    );
  }
}

效果圖如下:


圖17 Transform Property

參考文章:

Flutter?—?Container Cheat Sheet

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市礁竞,隨后出現(xiàn)的幾起案子糖荒,更是在濱河造成了極大的恐慌,老刑警劉巖模捂,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捶朵,死亡現(xiàn)場離奇詭異,居然都是意外死亡狂男,警方通過查閱死者的電腦和手機综看,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖食,“玉大人红碑,你說我怎么就攤上這事。” “怎么了析珊?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵羡鸥,是天一觀的道長。 經(jīng)常有香客問我忠寻,道長惧浴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任奕剃,我火速辦了婚禮赶舆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祭饭。我一直安慰自己,他們只是感情好叙量,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布倡蝙。 她就那樣靜靜地躺著,像睡著了一般绞佩。 火紅的嫁衣襯著肌膚如雪寺鸥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天品山,我揣著相機與錄音胆建,去河邊找鬼。 笑死肘交,一個胖子當著我的面吹牛笆载,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涯呻,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼凉驻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了复罐?” 一聲冷哼從身側(cè)響起涝登,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎效诅,沒想到半個月后胀滚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡乱投,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年咽笼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戚炫。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡褐荷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘹悼,到底是詐尸還是另有隱情叛甫,我是刑警寧澤层宫,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站其监,受9級特大地震影響萌腿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抖苦,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一毁菱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锌历,春花似錦贮庞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卤材,卻和暖如春遮斥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扇丛。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工术吗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帆精。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓较屿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卓练。 傳聞我的和親對象是個殘疾皇子吝镣,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容