Flutter入門(mén)(7):Flutter 組件之 Container 詳解

1. Container 介紹

基礎(chǔ)屬性不做太多介紹,有興趣的可以去Flutter 中文網(wǎng) 了解一下嘉赎。

2. 示范代碼

代碼下載地址米辐。如果對(duì)你有幫助的話(huà)記得給個(gè)關(guān)注,代碼會(huì)根據(jù)我的 Flutter 專(zhuān)題不斷更新务冕。

container.dart 路徑如下
/FMStudyApp/lib/Widgets/BaseWidget/container.dart

3. 基本屬性

優(yōu)雅的編程血当,我們先單獨(dú)創(chuàng)建一個(gè) container.dart 文件,用來(lái)試用 Container 的屬性和效果禀忆。

import 'package:flutter/material.dart';

class FMContainerVC extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Scaffold(
        appBar: AppBar(
          title: Text(
            "Container",
          ),
          backgroundColor: Colors.lightBlue,
        ),
        body: _container(),
      ),
    );
  }

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
    );
  }
}

4. 顏色與大小

直接使用 color 屬性改變背景色臊旭,使用 width 設(shè)置寬度,使用 height 屬性設(shè)置高度油湖。

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      width: 320,
      height: 200,
      color: Colors.red,
    );
  }

使用 constraints 屬性來(lái)改變 container 大小

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      constraints: BoxConstraints.expand(
        width: 320,
        height: 200,
      ),
      color: Colors.red,
    );
  }

使用約束來(lái)改變 container 的位置與大小巍扛,同時(shí)設(shè)置了大小和約束并且有沖突時(shí),會(huì)優(yōu)先執(zhí)行約束乏德。

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      constraints: BoxConstraints.expand(
        width: 320,
        height: 200,
      ),
      color: Colors.red,
      // 此時(shí)優(yōu)先執(zhí)行約束撤奸,會(huì)擠壓寬度小于 320
      margin: const EdgeInsets.only(left: 150, top: 100, right: 30),
    );
  }

5. Border 邊框設(shè)置

不得不贊一下,flutter 的邊框真的是自定義起來(lái)非常的方便喊括,可以給4個(gè)邊指定不同的顏色胧瓜,也可以給4個(gè)角不同的圓角。

我們先給這個(gè) container 添加一個(gè)邊框郑什,使用 decoration 屬性府喳,BoxDecoration 中的 border 屬性。

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      constraints: BoxConstraints.expand(
        width: 320,
        height: 200,
      ),
      decoration: BoxDecoration(
          border: Border.all(
          color: Colors.red,
          width: 3,
        ),
      ),
    );
  }

注意:decoration 屬性和 color 屬性不可以同時(shí)使用蘑拯,否則會(huì)如下報(bào)錯(cuò)钝满。在 decoration 屬性里也可以設(shè)置背景色兜粘,如需要同時(shí)使用邊框和背景色,可以在這里設(shè)置弯蚜。

Cannot provide both a color and a decoration
To provide both, use "decoration: BoxDecoration(color: color)".
'package:flutter/src/widgets/container.dart':
Failed assertion: line 283 pos 15: 'color == null || decoration == null'

我們?cè)趤?lái)改變一下邊框的角度

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      constraints: BoxConstraints.expand(
        width: 320,
        height: 200,
      ),
      decoration: BoxDecoration(
          border: Border.all(
            color: Colors.red,
            width: 3,
         ),
         borderRadius: BorderRadius.circular(30),
      ),
    );
  }
container border.png

其實(shí)這樣已經(jīng)能解決大部分需求了孔轴,下邊我們?cè)诮榻B下自定義邊框

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      constraints: BoxConstraints.expand(
        width: 320,
        height: 200,
      ),
      decoration: BoxDecoration(
          border: Border.all(
            color: Colors.red,
            width: 3,
         ),
         color: Colors.yellow,
        borderRadius: BorderRadius.only(
            topLeft: Radius.circular(0), 
            topRight: Radius.circular(0), 
            bottomLeft: Radius.circular(30), 
            bottomRight: Radius.circular(30)),
      ),
    );
  }
container border custom.png

下邊在自定義不同的邊框色

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      constraints: BoxConstraints.expand(
        width: 320,
        height: 200,
      ),
      decoration: BoxDecoration(
          border: Border.all(
            color: Colors.red,
            width: 3,
         ),
        border: Border(
            top: BorderSide(
              width: 3,
              color: Colors.cyan,
            ),
            left: BorderSide(
              width: 3,
              color: Colors.blue,
            ),
            right: BorderSide(
              width: 3,
              color: Colors.black,
            ),
            bottom: BorderSide(
              width: 3,
              color: Colors.orange,
            ),
         ),
       ),
    );
  }
container border colorful.png

注意:使用自定義 border 時(shí),不可以使用 borderRadius 屬性碎捺,否則會(huì)有如下報(bào)錯(cuò)

A borderRadius can only be given for a uniform Border.

6. 漸變色背景設(shè)置

使用 gradient 屬性給 container 設(shè)置漸變背景色路鹰。

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      constraints: BoxConstraints.expand(
        width: 320,
        height: 200,
      ),
      decoration: BoxDecoration(
          border: Border.all(
            color: Colors.red,
            width: 3,
         ),
         borderRadius: BorderRadius.circular(30),
        gradient: LinearGradient(colors: [Colors.white, Colors.yellow], begin: FractionalOffset(0, 0), end: FractionalOffset(0, 1)),
      ),
    );
  }
container gradient.png

7. 設(shè)置背景圖

使用 image 屬性設(shè)置背景圖,其中 centerSlice 可以改變填充大小收厨,可以自行實(shí)驗(yàn)效果晋柱。

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      constraints: BoxConstraints.expand(
        width: 320,
        height: 200,
      ),
      decoration: BoxDecoration(
          border: Border.all(
            color: Colors.red,
            width: 3,
         ),
         borderRadius: BorderRadius.circular(30),
         image: DecorationImage(
            image: NetworkImage('http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg'),
          // centerSlice: Rect.largest,
         ),
         gradient: LinearGradient(colors: [Colors.white, Colors.yellow], begin: FractionalOffset(0, 0), end: FractionalOffset(0, 1)),
      ),
    );
  }
container image.png

8. 陰影

使用 boxShadow 屬性設(shè)置陰影。

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      constraints: BoxConstraints.expand(
        width: 320,
        height: 200,
      ),
      decoration: BoxDecoration(
          border: Border.all(
            color: Colors.red,
            width: 3,
         ),
         borderRadius: BorderRadius.circular(30),
         boxShadow: [BoxShadow(color: Colors.grey, offset: Offset(10,10))],
         image: DecorationImage(
            image: NetworkImage('http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg'),
          // centerSlice: Rect.largest,
         ),
         gradient: LinearGradient(colors: [Colors.white, Colors.yellow], begin: FractionalOffset(0, 0), end: FractionalOffset(0, 1)),
      ),
    );
  }
container shadow.png

9. 旋轉(zhuǎn)

使用 transform 屬性設(shè)置旋轉(zhuǎn)诵叁,這里不做太多敘述了雁竞。

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      constraints: BoxConstraints.expand(
        width: 320,
        height: 200,
      ),
      decoration: BoxDecoration(
          border: Border.all(
            color: Colors.red,
            width: 3,
         ),
         borderRadius: BorderRadius.circular(30),
         boxShadow: [BoxShadow(color: Colors.grey, offset: Offset(10,10))],
         image: DecorationImage(
            image: NetworkImage('http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg'),
          // centerSlice: Rect.largest,
         ),
         gradient: LinearGradient(colors: [Colors.white, Colors.yellow], begin: FractionalOffset(0, 0), end: FractionalOffset(0, 1)),
      ),
      transform: Matrix4.rotationZ(0.1),
    );
  }
container rotate.png

10. child 子控件

使用 child 屬性給 container 添加子控件,使用 padding 屬性設(shè)置子控件的范圍拧额,使用 alignment 來(lái)設(shè)置子控件的居中屬性浓领。

  Container _container() {
    return Container(
      // 在這里嘗試 Container 屬性效果
      constraints: BoxConstraints.expand(
        width: 320,
        height: 200,
      ),
      decoration: BoxDecoration(
          border: Border.all(
            color: Colors.red,
            width: 3,
         ),
         borderRadius: BorderRadius.circular(30),
         boxShadow: [BoxShadow(color: Colors.grey, offset: Offset(10,10))],
         image: DecorationImage(
            image: NetworkImage('http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg'),
          // centerSlice: Rect.largest,
         ),
         gradient: LinearGradient(colors: [Colors.white, Colors.yellow], begin: FractionalOffset(0, 0), end: FractionalOffset(0, 1)),
      ),
      transform: Matrix4.rotationZ(0.1),
      alignment: Alignment.centerLeft,
      padding: const EdgeInsets.all(30),
      child: Text(
        "Container",
        style: TextStyle(
          fontSize: 30,
          color: Colors.red,
        ),
      ),
    );
  }

padding 屬性,你可以理解為 child 距離該 container 4個(gè)邊框的邊界距離势腮,例如 padding: const EdgeInsets.all(30),
就是距離 child 上方距離 container 上方 30联贩,左右下三個(gè)方向同理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捎拯,隨后出現(xiàn)的幾起案子泪幌,更是在濱河造成了極大的恐慌,老刑警劉巖署照,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祸泪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡建芙,警方通過(guò)查閱死者的電腦和手機(jī)没隘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)禁荸,“玉大人右蒲,你說(shuō)我怎么就攤上這事「鲜欤” “怎么了瑰妄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)映砖。 經(jīng)常有香客問(wèn)我间坐,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任竹宋,我火速辦了婚禮劳澄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜈七。我一直安慰自己浴骂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布宪潮。 她就那樣靜靜地躺著,像睡著了一般趣苏。 火紅的嫁衣襯著肌膚如雪狡相。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天食磕,我揣著相機(jī)與錄音尽棕,去河邊找鬼。 笑死彬伦,一個(gè)胖子當(dāng)著我的面吹牛滔悉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播单绑,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼回官,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了搂橙?” 一聲冷哼從身側(cè)響起歉提,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎区转,沒(méi)想到半個(gè)月后苔巨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡废离,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年侄泽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜻韭。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肖方,靈堂內(nèi)的尸體忽然破棺而出诀豁,到底是詐尸還是另有隱情,我是刑警寧澤窥妇,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布烹骨,位于F島的核電站,受9級(jí)特大地震影響沮焕,放射性物質(zhì)發(fā)生泄漏吨岭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一峦树、第九天 我趴在偏房一處隱蔽的房頂上張望辣辫。 院中可真熱鬧,春花似錦魁巩、人聲如沸急灭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葬馋。三九已至,卻和暖如春肾扰,著一層夾襖步出監(jiān)牢的瞬間畴嘶,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工集晚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窗悯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓偷拔,卻偏偏與公主長(zhǎng)得像蟀瞧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子条摸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350