Flutter筆記(四) - Flutter的布局Widget(二)

多子布局組件

在開發(fā)中蜀变,我們經(jīng)常需要將多個(gè)Widget放在一起進(jìn)行布局驻售,比如水平方向、垂直方向排列看政,甚至有時(shí)候需要他們進(jìn)行層疊肴盏,比如圖片上面放一段文字等;
這個(gè)時(shí)候我們需要使用多子布局組件(Multi-child layout widgets)帽衙。
比較常用的多子布局組件是Row、Column贞绵、Stack厉萝。

1. Flex組件

Row組件和Column組件都繼承自Flex;

  • Flex組件和RowColumn屬性主要的區(qū)別就是多一個(gè) direction;
  • 當(dāng)direction的值為Axis.horizontal的時(shí)候榨崩,則是Row谴垫,呈一行排布;
  • 當(dāng)direction的值為Axis.vertical的時(shí)候母蛛,則是Column翩剪,呈一列排布;

它們都有主軸(Main Axis)和交叉軸(Cross Axis)的概念:

  • 對于Row來說彩郊,水平方向是主軸前弯,豎直方向是交叉軸;


    Row@2x.png
  • 對于Column來說秫逝,豎直方向是主軸恕出,水平方向是交叉軸;


    Column.png

2. Row組件

Row({
  Key key,
  MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start, // 主軸對齊方式
  MainAxisSize mainAxisSize = MainAxisSize.max, // 水平方向盡可能大
  CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center, // 交叉處對齊方式
  TextDirection textDirection, // 水平方向子widget的布局順序(默認(rèn)為系統(tǒng)當(dāng)前Locale環(huán)境的文本方向(如中文违帆、英語都是從左往右浙巫,而阿拉伯語是從右往左))
  VerticalDirection verticalDirection = VerticalDirection.down, // 表示Row縱軸(垂直)的對齊方向
  TextBaseline textBaseline, // 如果上面是baseline對齊方式,那么選擇什么模式(有兩種可選)
  List<Widget> children = const <Widget>[],
})

2.1. mainAxisSize

Row的特點(diǎn):

  • 水平方向盡可能占據(jù)較大的空間刷后;

  • 垂直方向包裹內(nèi)容;


    WechatIMG49.jpeg
  • 如果水平方向也希望包裹內(nèi)容的畴,那么設(shè)置mainAxisSize = min;


    WechatIMG48.jpeg
return RaisedButton(
        onPressed: (){
        },
      color: Colors.red,
      child: Row(
        mainAxisSize: MainAxisSize.min,
        children: [
          Icon(Icons.favorite),
          Text("收藏"),
        ],
      ),
    );

2.2. mainAxisAlignment

元素在Row主軸上的布局方式尝胆,它是一個(gè)枚舉類型:

  • start :主軸開始的位置挨個(gè)擺放元素丧裁;
  • end :主軸結(jié)束的位置挨個(gè)擺放元素;
  • center :主軸的中心點(diǎn)對齊班巩;
  • spaceBetween: 左右兩邊的間距為0渣慕,其他元素之間平分間距嘶炭;
  • spaceAround:左右兩邊的間距是其他元素的間距的一半;
  • spaceEvenly:間距平分逊桦;
class _YZHomeContentState extends State<YZHomeContent> {
  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        Container(width: 80, height: 60, color: Colors.red,),
        Container(width: 120, height: 100, color: Colors.orange,),
        Container(width: 90, height: 80, color: Colors.blue,),
        Container(width: 50, height: 50, color: Colors.green,),
      ],
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    );
  }
}
WechatIMG50.jpeg

2.3. CrossAxisAlignment

 crossAxisAlignment: CrossAxisAlignment.end,

元素在Row交叉軸上的布局方式

  • start:交叉軸的起始位置對齊眨猎;
  • end:交叉軸的結(jié)束位置對齊(垂直方向是包裹內(nèi)容的);
  • center:中心點(diǎn)對齊(默認(rèn)值)
  • baseLine:基線對齊强经;(必須有文本才有效果)
  • stretch: 先將Row占據(jù)交叉軸盡可能大的空間睡陪,再將所有的子Widget拉伸到最大;

2.4. Expanded

空間分配:拉伸或收縮匿情;

  • 如果控件之間有間隔:拉伸兰迫;
  • 如果控件組合寬度超過了屏幕,則壓縮炬称;


    WechatIMG943.jpeg

    如上圖汁果,間隔等分,如果想把所有間隔分配給第一個(gè)玲躯;

return  Row(
      children: [
        Expanded(
            child: Container(width: 80, height: 60, color: Colors.red,),
        ),
        Container(width: 120, height: 100, color: Colors.orange,),
        Container(width: 90, height: 80, color: Colors.blue,),
        Container(width: 50, height: 50, color: Colors.green,),
      ],
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      crossAxisAlignment: CrossAxisAlignment.end,
    );
  }
}

效果:

  • 第一個(gè)控件寬度做了拉伸据德;


    WechatIMG942.jpeg
2.4.1 flex作用
 Expanded(
       flex: 1,
       child: Container(width: 80, height: 60, color: Colors.red,),
 ),
Expanded(
        flex: 2,
        child: Container(width: 40, height: 60, color: Colors.green,),
  ),

剩余空間分配比例: 當(dāng)有多個(gè)Expanded時(shí),

  • 如果flex相等跷车,則拉伸的寬度相同棘利;
  • 如果flex不等,按比例拉伸朽缴,如上面flex:2控件的寬度拉伸為flex: 1寬度的2倍善玫,原來的width數(shù)值不再起作用。

3. Column組件

同Row;


4. Stack組件

在開發(fā)中密强,我們多個(gè)組件很有可能需要重疊顯示茅郎,比如在一張圖片上顯示文字或者一個(gè)按鈕等。在Flutter中我們需要使用層疊布局Stack誓斥。

4.1 Stack介紹

Stack的大小默認(rèn)是包裹內(nèi)容的.

  • alignment:從什么位置開始排布所有的子Widget;
  • fit: expand 將子元素拉伸到盡可能大;
  • overflow:超出部分如何處理;
  Stack({
    Key key,
    this.alignment = AlignmentDirectional.topStart,
    this.textDirection,
    this.fit = StackFit.loose,
    this.overflow = Overflow.clip,
    this.clipBehavior = Clip.hardEdge,
    List<Widget> children = const <Widget>[],
  }) 

4.2 示例

class _YZHomeContentState extends State<YZHomeContent> {
  @override
  Widget build(BuildContext context) {
    return Stack(
      alignment: AlignmentDirectional.bottomCenter,
      overflow: Overflow.visible,
      children: [
        Image.asset("assets/images/image_01.png",),
        Container(width: 150, height: 50, color: Colors.red,),
        // Positioned( //文字在Stack內(nèi)部相對布局調(diào)整
        //   right: 10,
        //   bottom: 20,
        //   child:
          Text("這是圖片上的文字"),
        // ),
      ],
    );
  }
}

WechatIMG51.jpeg
class _YZHomeContentState extends State<YZHomeContent> {

   bool _isFavor = false;

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        Image.asset("assets/images/image_02.jpeg",width: MediaQuery.of(context).size.width,),
        Positioned(
          left: 0,
          right: 0,
          bottom: 0,
          child: Container(
            padding: EdgeInsets.all(8),
            color: Color.fromARGB(10, 0, 0, 0),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Text("這是圖片上的文字描述", style: TextStyle(fontSize: 15, color: Colors.red),),
                IconButton(
                    icon: Icon(
                        Icons.favorite,
                        color: _isFavor ? Colors.red : Colors.white,
                    ),
                    onPressed: () {
                      setState(() {
                        _isFavor = !_isFavor;
                      });
                }),
              ],
            ),
          ),
        ),
      ],
    );
  }
}
WechatIMG52.jpeg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末只洒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子劳坑,更是在濱河造成了極大的恐慌毕谴,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件距芬,死亡現(xiàn)場離奇詭異涝开,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)框仔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門舀武,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人离斩,你說我怎么就攤上這事银舱”衲洌” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵寻馏,是天一觀的道長棋弥。 經(jīng)常有香客問我,道長诚欠,這世上最難降的妖魔是什么顽染? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮轰绵,結(jié)果婚禮上粉寞,老公的妹妹穿的比我還像新娘。我一直安慰自己左腔,他們只是感情好唧垦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著液样,像睡著了一般业崖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓄愁,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音狞悲,去河邊找鬼撮抓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛摇锋,可吹牛的內(nèi)容都是我干的丹拯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼荸恕,長吁一口氣:“原來是場噩夢啊……” “哼乖酬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起融求,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤咬像,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后生宛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體县昂,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年陷舅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倒彰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莱睁,死狀恐怖待讳,靈堂內(nèi)的尸體忽然破棺而出芒澜,到底是詐尸還是另有隱情,我是刑警寧澤创淡,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布痴晦,位于F島的核電站,受9級特大地震影響辩昆,放射性物質(zhì)發(fā)生泄漏阅酪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一汁针、第九天 我趴在偏房一處隱蔽的房頂上張望术辐。 院中可真熱鬧,春花似錦施无、人聲如沸辉词。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑞躺。三九已至,卻和暖如春兴想,著一層夾襖步出監(jiān)牢的瞬間幢哨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工嫂便, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捞镰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓毙替,卻偏偏與公主長得像岸售,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子厂画,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

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

  • 為了實(shí)現(xiàn)界面內(nèi)組件的各種排布方式凸丸,我們需要進(jìn)行布局,和其他端不同的是袱院,F(xiàn)lutter中因?yàn)槿f物皆Widget屎慢,所以...
    5e4c664cb3ba閱讀 628評論 1 1
  • 一. 單子布局組件 單子布局組件的含義是其只有一個(gè)子組件抛人,可以通過設(shè)置一些屬性設(shè)置該子組件所在的位置信息等。比較常...
    張無奈閱讀 373評論 0 0
  • 前言 本文的目的是為了讓讀者掌握不同布局類Widget的布局特點(diǎn)脐瑰,分享一些在實(shí)際使用過程遇到的一些問題妖枚,在《Flu...
    xqqlv閱讀 5,261評論 0 18
  • 一. 多子布局組件 在開發(fā)中,我們經(jīng)常需要將多個(gè)Widget放在一起進(jìn)行布局苍在,比如水平方向绝页、垂直方向排列荠商,甚至有時(shí)...
    happy神悅閱讀 440評論 0 0
  • 一. 單子布局組件 單子布局組件的含義是其只有一個(gè)子組件,可以通過設(shè)置一些屬性設(shè)置該子組件所在的位置信息等续誉。比較常...
    AlanGe閱讀 567評論 0 0