Flutter基礎(chǔ)組件(2)-Container

Flutter中可以經(jīng)呈渭埃看到的控件Container,所以我們這篇文章開(kāi)始細(xì)致介紹一下Container.

1 簡(jiǎn)介

A convenience widget that combines common painting, positioning, and sizing widgets.

Container在Flutter開(kāi)發(fā)中非常常見(jiàn),官方給出的簡(jiǎn)介是一個(gè)結(jié)合了繪制(painting),定位(positioning),以及尺寸(sizing)widget的widget.

通過(guò)官方的描述可以得出幾個(gè)信息,它是一個(gè)組合的widget弟孟,內(nèi)部有繪制widget、定位widget、尺寸widget。后續(xù)看到的不少widget呆躲,都是通過(guò)一些更基礎(chǔ)的widget組合而成的。

1.1 Container的組成

Container的組成:

  • 最里面的是child元素;
  • child元素首先會(huì)被padding包裹著;
  • 然后添加額外的constrainits限制;
  • 最后添加margin;

Container的繪制過(guò)程:

  • 首先會(huì)繪制transform效果;
  • 接著繪制decoration;
  • 然后繪制child;
  • 最后繪制foregroundDecoration;

Container自身尺寸的調(diào)節(jié)分兩種情況:

  • Container再看沒(méi)有子節(jié)點(diǎn)(children)的時(shí)候,會(huì)試圖去變得足夠大.除非constraints是unbounded限制,在這種情況下,Container會(huì)試圖變得足夠小.
  • 帶子節(jié)點(diǎn)的Container,會(huì)根據(jù)子節(jié)點(diǎn)尺寸調(diào)節(jié)自身尺寸,但是Container構(gòu)造器中如果包含了width捶索、height以及constraints,則會(huì)按照構(gòu)造器中的參數(shù)來(lái)進(jìn)行尺寸調(diào)節(jié).

1.2 布局

Container組合了一系列的widget,這些widget都有自己的布局行為,因此Container的布局行為會(huì)比較復(fù)雜.

一般情況下插掂,Container會(huì)遵循如下順序去嘗試布局:

  • 對(duì)齊(alignment);
  • 調(diào)節(jié)自身尺寸適合子節(jié)點(diǎn);
  • 擴(kuò)展自身去適應(yīng)父節(jié)點(diǎn);
  • 調(diào)節(jié)自身到足夠小;

進(jìn)一步說(shuō):

  • 如果沒(méi)有子節(jié)點(diǎn)、沒(méi)有設(shè)置width腥例、height以及constraints辅甥,并且父節(jié)點(diǎn)沒(méi)有設(shè)置unbounded的限制,Container會(huì)將自身調(diào)整到足夠小.
  • 如果沒(méi)有子節(jié)點(diǎn)院崇、對(duì)齊方式(alignment),但是提供了width袍祖、height或者constraints底瓣,那么Container會(huì)根據(jù)自身以及父節(jié)點(diǎn)的限制,將自身調(diào)節(jié)到足夠小.
  • 如果沒(méi)有子節(jié)點(diǎn)蕉陋、width捐凭、height、constraints以及alignment凳鬓,但是父節(jié)點(diǎn)提供了bounded限制茁肠,那么Container會(huì)按照父節(jié)點(diǎn)的限制,將自身調(diào)整到足夠大.
  • 如果有alignment缩举,父節(jié)點(diǎn)提供了unbounded限制垦梆,那么Container將會(huì)調(diào)節(jié)自身尺寸來(lái)包住child.
  • 如果有alignment,并且父節(jié)點(diǎn)提供了bounded限制仅孩,那么Container會(huì)將自身調(diào)整的足夠大(在父節(jié)點(diǎn)的范圍內(nèi))托猩,然后將child根據(jù)alignment調(diào)整位置.
  • 含有child,但是沒(méi)有width辽慕、height京腥、constraints以及alignment,Container會(huì)將父節(jié)點(diǎn)的constraints傳遞給child溅蛉,并且根據(jù)child調(diào)整自身.

1.3 繼承關(guān)系

Object > Diagnosticable > DiagnosticableTree > Widget > StatelessWidget > Container

從繼承關(guān)系可以看出公浪,Container是一個(gè)StatelessWidget。Container并不是一個(gè)最基礎(chǔ)的widget船侧,它是由一系列的基礎(chǔ)widget組合而成欠气。

2. 源碼解析

構(gòu)造函數(shù)如下:

Container({
    Key key,
    this.alignment,
    this.padding,
    Color color,
    Decoration decoration,
    this.foregroundDecoration,
    double width,
    double height,
    BoxConstraints constraints,
    this.margin,
    this.transform,
    this.child,
  })

2.1 屬性解析

  • key:Container唯一標(biāo)識(shí)符,用于查找更新.
  • alignment:控制child的對(duì)齊方式镜撩,如果container或者container父節(jié)點(diǎn)尺寸大于child的尺寸晃琳,這個(gè)屬性設(shè)置會(huì)起作用,有很多種對(duì)齊方式.
  • padding:decoration內(nèi)部的空白區(qū)域,如果有child的話卫旱,child位于padding內(nèi)部人灼。padding與margin的不同之處在于,padding是包含在content內(nèi)顾翼,而margin則是外部邊界投放,設(shè)置點(diǎn)擊事件的話,padding區(qū)域會(huì)響應(yīng)适贸,而margin區(qū)域不會(huì)響應(yīng).
  • color:用來(lái)設(shè)置container背景色灸芳,如果foregroundDecoration設(shè)置的話,可能會(huì)遮蓋color效果.
  • decoration:繪制在child后面的裝飾拜姿,設(shè)置了decoration的話烙样,就不能設(shè)置color屬性,否則會(huì)報(bào)錯(cuò)蕊肥,此時(shí)應(yīng)該在decoration中進(jìn)行顏色的設(shè)置.
  • foregroundDecoration:繪制在child前面的裝飾.
  • width:container的寬度谒获,設(shè)置為double.infinity可以強(qiáng)制在寬度上撐滿,不設(shè)置壁却,則根據(jù)child和父節(jié)點(diǎn)兩者一起布局.
  • height:container的高度批狱,設(shè)置為double.infinity可以強(qiáng)制在高度上撐滿.
  • constraints:添加到child上額外的約束條件.
  • margin:圍繞在decoration和child之外的空白區(qū)域,不屬于內(nèi)容區(qū)域.
  • transform:設(shè)置container的變換矩陣展东,類型為Matrix4.
  • child:container中的內(nèi)容widget.

例如:

new Container(
  constraints: BoxConstraints.expand(
    height:Theme.of(context).textTheme.display1.fontSize * 1.1 + 200.0,
  ),
  decoration: BoxDecoration(
    border: Border.all(width: 2.0, color: Colors.red),
    color: Colors.grey,
    borderRadius: BorderRadius.all(new Radius.circular(20.0)),
    image: DecorationImage(
      image: NetworkImage('http://h.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=0d023672312ac65c67506e77cec29e27/9f2f070828381f30dea167bbad014c086e06f06c.jpg'),
      centerSlice: Rect.fromLTRB(270.0, 180.0, 1360.0, 730.0),
    ),
//這是一個(gè)漸變顏色的屬性,在使用時(shí)注意不能設(shè)置container的color,否則會(huì)報(bào)錯(cuò).
//gradient: const LinearGradient(
//                  colors: [Colors.purple,Colors.green,Colors.cyanAccent],
//             ),
  ),
  padding: const EdgeInsets.all(8.0),
  alignment: Alignment.center,
  child: Text('Hello World',
    style: Theme.of(context).textTheme.display1.copyWith(color: Colors.black)),
  transform: Matrix4.rotationZ(0.3),
)

其中decoration可以設(shè)置邊框赔硫、背景色、背景圖片盐肃、圓角等屬性爪膊,非常實(shí)用。對(duì)于transform這個(gè)屬性砸王,一般有過(guò)其他平臺(tái)開(kāi)發(fā)經(jīng)驗(yàn)的惊完,都大致了解,這種變換处硬,一般不是變換的實(shí)際位置小槐,而是變換的繪制效果,也就是說(shuō)它的點(diǎn)擊以及尺寸荷辕、間距等都是按照未變換前的.

實(shí)際效果.png
                            想了解更多Flutter學(xué)習(xí)知識(shí)請(qǐng)聯(lián)系:QQ(814299221)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凿跳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疮方,更是在濱河造成了極大的恐慌控嗜,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骡显,死亡現(xiàn)場(chǎng)離奇詭異疆栏,居然都是意外死亡曾掂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門壁顶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)珠洗,“玉大人,你說(shuō)我怎么就攤上這事若专⌒肀停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵调衰,是天一觀的道長(zhǎng)膊爪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嚎莉,這世上最難降的妖魔是什么米酬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮趋箩,結(jié)果婚禮上赃额,老公的妹妹穿的比我還像新娘。我一直安慰自己阁簸,他們只是感情好爬早,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布哼丈。 她就那樣靜靜地躺著启妹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪醉旦。 梳的紋絲不亂的頭發(fā)上饶米,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音车胡,去河邊找鬼檬输。 笑死,一個(gè)胖子當(dāng)著我的面吹牛匈棘,可吹牛的內(nèi)容都是我干的丧慈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼主卫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逃默!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起簇搅,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤完域,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瘩将,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吟税,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凹耙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肠仪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肖抱。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖藤韵,靈堂內(nèi)的尸體忽然破棺而出虐沥,到底是詐尸還是另有隱情,我是刑警寧澤泽艘,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布欲险,位于F島的核電站,受9級(jí)特大地震影響匹涮,放射性物質(zhì)發(fā)生泄漏天试。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一然低、第九天 我趴在偏房一處隱蔽的房頂上張望喜每。 院中可真熱鬧,春花似錦雳攘、人聲如沸带兜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刚照。三九已至,卻和暖如春喧兄,著一層夾襖步出監(jiān)牢的瞬間无畔,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工吠冤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浑彰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓拯辙,卻偏偏與公主長(zhǎng)得像郭变,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涯保,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349