06-Flutter 容器類組件

容器類組件

  • Padding 留邊距
  • Container 容器-內(nèi)外邊距汁政,寬高
  • 裝飾器Decoration 容器樣式修改 BoxDecoration记劈,ShapeDecoration,UnderlineTabIndicator等
  • 約束Constraints 容器大小限制 ConstrainedBox目木,SizedBox,AspectRatio等
  • 裁切類容器:ClipOval军拟,ClipRRect柄冲,ClipRect
  • Scaffold 頁面骨架

Padding 內(nèi)邊距

Padding(
   child: Text("AAAAAAAA"),
   padding: EdgeInsets.fromLTRB(10,100, 30, 80),//依次為左现横,上,右戒祠,下設(shè)置邊距
),

還可以使用以下方式快速添加邊距姜盈,適應(yīng)不同場(chǎng)景的需求

padding: EdgeInsets.all(10),//4個(gè)邊都留10邊距
padding: EdgeInsets.only(left: 10,bottom: 20),//可選參數(shù),指定哪條邊留邊距
padding: EdgeInsets.symmetric(vertical: 10,horizontal: 20),//可選參數(shù)示血,上下邊距10救拉,左右邊距20

Container 容器-內(nèi)外邊距,寬高

Container(
        width: 300,//容器寬
        height: 200,//容器高
        padding: EdgeInsets.all(20),//內(nèi)邊距
        margin: EdgeInsets.all(20),//外邊距
//        color: Colors.red,//背景色告喊,和decoration屬性互斥派昧,只能設(shè)置一個(gè),否則會(huì)報(bào)錯(cuò)
        //裝飾器
//        decoration: ShapeDecoration(color: Colors.red, shape: CircleBorder()),
        decoration: BoxDecoration(
          color: Colors.blue,//背景顏色
          borderRadius: BorderRadius.circular(20), //圓角
          boxShadow: <BoxShadow>[
            BoxShadow(
              color: Colors.black26, //陰影的顏色
              blurRadius: 10, //虛化的寬度
              spreadRadius: 10, //陰影和原物大小的差值--不包括虛化的部分
              offset: Offset(40, 40), //陰影的偏移量
            ),
          ],
        ),
        //容器約束-大小限制
        constraints: BoxConstraints(
          minHeight: 100,
          minWidth: 100,
          maxWidth: 200,//這里限制了200秆吵,所以上面設(shè)置的寬度300無效
          maxHeight: 150,
        ),
        child: Text("AAAAAAAA"),
      ),
widget_container.png

裝飾器Decoration

上面Conatiner中用到了一個(gè)BoxDecoration纳寂,用于裝飾Container容器的樣式,圓角烈疚,背景色爷肝,陰影等陆错,其實(shí)Container內(nèi)部使用的是DecoratedBox,只是進(jìn)行了一次封裝对嚼,方便使用绳慎。Flutter除了提供BoxDecoration,還有ShapeDecoration靡砌,UnderlineTabIndicator珊楼,F(xiàn)lutterLogoDecoration,他們都是Decoration的子類厕宗。

約束Constraints

約束容器的大小已慢,上面代碼中的Container限制了最大最小的寬高,內(nèi)部實(shí)現(xiàn)也是進(jìn)行了一次封裝蛇受,使用的是ConstrainedBox,另外Flutter還提供了SliverConstraints兢仰,在滾動(dòng)布局中進(jìn)行約束

如果不使用Container把将,直接使用DecoratedBox和ConstrainedBox也是可以的,自己去實(shí)現(xiàn)child察蹲,如下使用:

DecoratedBox(                                   
  decoration: BoxDecoration(                    
    //背景顏色                                      
    color: Colors.blue, //圓角                    
    borderRadius: BorderRadius.circular(20),    
    boxShadow: <BoxShadow>[                     
      BoxShadow(                                
        color: Colors.black26, //陰影的顏色          
        blurRadius: 10, //虛化的寬度                 
        spreadRadius: 10, //陰影和原物大小的差值--不包括虛化的部分
        offset: Offset(40, 40), //陰影的偏移量        
      ),                                        
    ],                                          
  ),                                            
  child: Text("AAAAAAAA"),                      
), 
ConstrainedBox(
  constraints: BoxConstraints(
    minHeight: 100,
    minWidth: 100,
    maxWidth: 200, //這里限制了200,所以上面設(shè)置的寬度300無效
    maxHeight: 150,
  ),
  child: Container(
    color: Colors.red,
    width: 100,
    child: Center(child: Text("AAAAAAA")),
  ),
),

尺寸限制容器:ConstrainedBox漫拭,SizedBox混稽,AspectRatio等

ConstrainedBox:大小約束
SizedBox:指定大小的容器
UnconstrainedBox:解除父容器大小限制
AspectRatio:指定比例
他們都是SingleChildRenderObjectWidget的子類,都只有一個(gè)child widget礼旅。

Container(
  margin: EdgeInsets.only(top: 10),
  child: SizedBox(
    width: 100,
    height: 100,
    child: Container(
      color: Colors.red,
      width: 50,//這里設(shè)置無效
      height: 200,//這里設(shè)置無效
      child: Center(child: Text("AAAAAAA")),
    ),
  ),
),
widget_sizebox.png
Container(
  margin: EdgeInsets.only(top: 20),
  width: 100, //指定寬為100
  child: AspectRatio(
    aspectRatio: 0.5, //父容器寬為100痘系,寬高比為0.5饿自,則高度為200
    child: Container(
      color: Colors.red,
      child: Text(
          "11111111111111111111111111111111111111111111111111111111111111111111111111111"
          "11111111111111111111111111111111111111111111111111111111111111111111111111"
          "11111111111111111111111111111111111111111111111111111111111111111111111111"),
    ),
  ),
),
widget_aspectratio.png

裁切類容器:ClipOval璃俗,ClipRRect,ClipRect

圓形頭像城豁,圓角矩形唱星,矩形裁切

ClipOval(
  child: Image.network(
    IMAGE_0,
    fit: BoxFit.cover,
    width: 50,
    height: 50,
  ),
),
ClipRect(
  child: Container(
    color: Colors.black12,
    child: Image.network(
      IMAGE_0,
      fit: BoxFit.cover,
      width: 100,
      height: 100,
    ),
  ),
),
Container(
  margin: EdgeInsets.only(top: 10),
  child: ClipRRect(
    borderRadius: BorderRadius.all(
      Radius.circular(30),
    ),
    child: Container(
      color: Colors.black12,
      child: Image.network(
        IMAGE_0,
        fit: BoxFit.cover,
        width: 200,
        height: 200,
      ),
    ),
  ),
)
widget_clip.png

Scaffold 骨架容器

完整的骨架容器包含了

頂部導(dǎo)航欄:appBar
內(nèi)容體:body
左側(cè)和右側(cè)的抽屜:drawer间聊、endDrawer
底部菜單導(dǎo)航:bottomNavigationBar
懸浮按鈕:floatingActionButton

widget_scaffold.png
Scaffold(
    //頂部導(dǎo)航
    appBar: AppBar(
      leading: Builder(
        builder: (BuildContext context) {
          return IconButton(
            icon: const Icon(Icons.menu),
            onPressed: () => {
              //點(diǎn)擊左上角的按鈕
              Scaffold.of(context).openDrawer()
            },
          );
        },
      ),
      title: Text("Scaffold的使用"),
      actions: <Widget>[
        IconButton(
          icon: Icon(Icons.folder_shared),
          onPressed: () => {},
        ),
        IconButton(
          icon: Icon(Icons.share),
          onPressed: () => {},
        ),
      ],
      bottom: TabBar(
        controller: _tabController,
        tabs: tabs.map((e) => Tab(text: e)).toList(),
      ),
    ),
    //內(nèi)容體
    body: TabBarView(
      controller: _tabController,
      children: <Widget>[
        Center(child: Text(tabs[0])),
        Center(child: Text(tabs[1])),
        Center(child: Text(tabs[2])),
      ],
    ),
    //左邊抽屜
    drawer: Container(
      width: 250,
      color: Colors.white,
      child: Center(
        child: FlatButton(
          child: Text("左側(cè)抽屜"),
          onPressed: () => {},
        ),
      ),
    ),
    //右邊抽屜
    endDrawer: Drawer(
      child: MediaQuery.removePadding(
        context: context, // removeTop: true,//移除抽屜菜單頂部默認(rèn)留白
        child: ListView(
          children: <Widget>[
            ListTile(leading: const Icon(Icons.add), title: const Text('Add account0')),
            ListTile(leading: const Icon(Icons.add), title: const Text('Add account1')),
            ListTile(leading: const Icon(Icons.add), title: const Text('Add account2')),
            ListTile(leading: const Icon(Icons.add), title: const Text('Add account3')),
          ],
        ),
      ),
    ),
    //底部菜單導(dǎo)航
    bottomNavigationBar: BottomNavigationBar(
      currentIndex: index,
      onTap: (i) => {
        setState(() {
          index = i;
        })
      },
      items: <BottomNavigationBarItem>[
        BottomNavigationBarItem(icon: Icon(Icons.map), title: Text(tabs[0])),
        BottomNavigationBarItem(icon: Icon(Icons.map), title: Text(tabs[1])),
        BottomNavigationBarItem(icon: Icon(Icons.map), title: Text(tabs[2])),
      ],
    ),
    floatingActionButton: FloatingActionButton(
      child: Icon(Icons.add),
      onPressed: () => {},
    ),
);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末型豁,一起剝皮案震驚了整個(gè)濱河市尚蝌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌飘言,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆吴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡笋熬,警方通過查閱死者的電腦和手機(jī)腻菇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門芜繁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绒极,“玉大人,你說我怎么就攤上這事垄提。” “怎么了凰兑?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵吏够,是天一觀的道長滩报。 經(jīng)常有香客問我,道長脓钾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任昌妹,我火速辦了婚禮握截,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚜厉。我一直安慰自己畜眨,他們只是感情好术瓮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布胞四。 她就那樣靜靜地躺著伶椿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脊另。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天旱捧,我揣著相機(jī)與錄音枚赡,去河邊找鬼谓谦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛反粥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播践剂,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼娜膘,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了军洼?” 一聲冷哼從身側(cè)響起演怎,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤爷耀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铆帽,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡德谅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年窄做,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片组砚。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掏颊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掩蛤,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布兄裂,位于F島的核電站阳藻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匾南。R本人自食惡果不足惜蛔外,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豹爹。 院中可真熱鬧矛纹,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至播演,卻和暖如春伴奥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拾徙。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工尼啡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崖瞭。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓书聚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雌续。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354