# Flutter Widgets 之 Expanded和Flexible

注意:無(wú)特殊說(shuō)明,F(xiàn)lutter版本及Dart版本如下:

  • Flutter版本: 1.12.13+hotfix.5
  • Dart版本: 2.7.0

Expanded和Flexible是控制Row、Column、Flex的子控件如何布局的控件,Expanded和Flexible可以擴(kuò)張?zhí)顫M主軸剩余空間,如何確認(rèn)主軸和交叉軸可以查看Flutter Widgets 之 Row和Column,這篇文章詳細(xì)介紹了主軸和交叉軸。

Expanded和Flexible的區(qū)別

首先看一下Expanded和Flexible的構(gòu)造函數(shù):

區(qū)別如下

  • Expanded 繼承自Flexible。
  • Flexible 中fit參數(shù)默認(rèn)是FlexFit.loose,而Expanded固定為FlexFit.tight。

因此如果在使用Flexible時(shí),設(shè)置fitFlexFit.tight,F(xiàn)lexible和Expanded就一模一樣了,代碼如下:

Flexible(
    fit: FlexFit.tight,
    ...
)

因此Expanded和Flexible的區(qū)別就是FlexFit.tightFlexFit.loose的區(qū)別:

  • tight:必須(強(qiáng)制)填滿剩余空間。
  • loose:盡可能大的填滿剩余空間,但是可以不填滿。

看下面2個(gè)例子就能看出其中的區(qū)別:

Row(
      children: <Widget>[
        Container(
          color: Colors.blue,
          height: 50,
          width: 100,
        ),
        Flexible(
            child: Container(
              color: Colors.red,
              height: 50,
            )
        ),
        Container(
          color: Colors.blue,
          height: 50,
          width: 100,
        ),
      ],
    )

效果如圖:


中間的紅色的控件是Container,此時(shí)填滿了剩余空間,我們給Container添加子控件Text,代碼如下:

Row(
      children: <Widget>[
        Container(
          color: Colors.blue,
          height: 50,
          width: 100,
        ),
        Flexible(
            child: Container(
              color: Colors.red,
              height: 50,
              child: Text('Container',style: TextStyle(color: Colors.white),),
            )
        ),
        Container(
          color: Colors.blue,
          height: 50,
          width: 100,
        ),
      ],
    )

效果圖:


神奇出現(xiàn)了,此時(shí)沒(méi)有填滿剩余空間,我們?cè)俳oContainer添加對(duì)齊方式,代碼如下:

Row(
      children: <Widget>[
        Container(
          color: Colors.blue,
          height: 50,
          width: 100,
        ),
        Flexible(
            child: Container(
              color: Colors.red,
              height: 50,
              alignment: Alignment.center,
              child: Text('Container',style: TextStyle(color: Colors.white),),
            )
        ),
        Container(
          color: Colors.blue,
          height: 50,
          width: 100,
        ),
      ],
    )

效果圖:


此時(shí)又填滿剩余空間,大家是否還記得Container控件的大小是調(diào)整的嗎?Container默認(rèn)是適配子控件大小的,但當(dāng)設(shè)置對(duì)齊方式時(shí)Container將會(huì)填滿父控件,在Flutter Widgets 之 Container中已經(jīng)詳細(xì)介紹,因此是否填滿剩余空間取決于子控件是否需要填滿父控件。

如果把Flexible中子控件由Container改為OutlineButton,代碼如下:

Row(
      children: <Widget>[
        Container(
          color: Colors.blue,
          height: 50,
          width: 100,
        ),
        Flexible(
          child: OutlineButton(
            child: Text('OutlineButton'),
          ),
        ),
        Container(
          color: Colors.blue,
          height: 50,
          width: 100,
        ),
      ],
    )

OutlineButton正常情況下是不充滿父控件的,因此最終的效果應(yīng)該是不填滿剩余空間,效果如圖:


如果想讓OutlineButton填滿剩余空間只需將Flexible改為Expanded,代碼如下:

Row(
      children: <Widget>[
        Container(
          color: Colors.blue,
          height: 50,
          width: 100,
        ),
        Expanded(
          child: OutlineButton(
            child: Text('OutlineButton'),
          ),
        ),
        Container(
          color: Colors.blue,
          height: 50,
          width: 100,
        ),
      ],
    )

效果如圖:


到這里有沒(méi)有感覺(jué)FlexFit.loose很雞肋啊,如果不想填滿剩余空間直接不使用這個(gè)組件不就可以了嗎,既然使用ExpandedFlexible就說(shuō)明想填滿剩余空間,可能是我們的需求還沒(méi)有那么變態(tài)吧。

<font color='red'>建議:如果想填滿剩余空間直接使用Expanded更方便。</font>

這里總結(jié)下Expanded和Flexible的區(qū)別:

  • Expanded:強(qiáng)制填滿剩余空間
  • Flexible:不強(qiáng)制填滿剩余空間,是否填滿剩余空間取決于子控件是否需要填滿父控件。

flex

參數(shù)flex表示權(quán)重(類似于Android中的weight),在Column中添加3個(gè)子控件,flex分別為1、2、3,代碼如下:

Column(
      children: <Widget>[
        Expanded(
          flex: 1,
          child: Container(
            color: Colors.blue,
            alignment: Alignment.center,
            child: Text('1 Flex/ 6 Total',style: TextStyle(color: Colors.white),),
          ),
        ),
        Expanded(
          flex: 2,
          child: Container(
            color: Colors.red,
            alignment: Alignment.center,
            child: Text('2 Flex/ 6 Total',style: TextStyle(color: Colors.white),),
          ),
        ),
        Expanded(
          flex: 3,
          child: Container(
            color: Colors.green,
            alignment: Alignment.center,
            child: Text('3 Flex/ 6 Total',style: TextStyle(color: Colors.white),),
          ),
        ),
      ],
    )

效果如圖:


<font color='red'>子控件占比 = 當(dāng)前子控件flex/所有子控件flex只和。</font>

更多相關(guān)閱讀:

如果這篇文章有幫助到您,希望您關(guān)注我的公眾號(hào),謝謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 本文的目的是為了讓讀者掌握不同布局類Widget的布局特點(diǎn),分享一些在實(shí)際使用過(guò)程遇到的一些問(wèn)題,在《Flu...
    xqqlv閱讀 5,406評(píng)論 0 18
  • 國(guó)慶后面兩天在家學(xué)習(xí)整理了一波flutter,基本把能擼過(guò)能看到的代碼都過(guò)了一遍,此文篇幅較長(zhǎng),建議保存(star...
    Nealyang閱讀 4,448評(píng)論 1 17
  • Widget 分類 widget 其實(shí)是Element 的配置文件,而Element是右RenderObject ...
    Ray_lawq閱讀 793評(píng)論 0 1
  • 我家男人從外面散步回來(lái),滿臉笑容。 問(wèn)他什么事情這么開(kāi)心? 他笑說(shuō)剛才在路上撿了個(gè)女兒。 我戳了他腦門一下,“你做...
    六月荷清香閱讀 1,302評(píng)論 34 47
  • 看到一則新聞,一個(gè)女孩在其一位大學(xué)男同學(xué)家離奇墜亡。從照片看女孩長(zhǎng)得端莊清秀,妝容貼切,讓人看起來(lái)很舒服,和這樣的...
    小柔簡(jiǎn)簡(jiǎn)閱讀 296評(píng)論 0 0

友情鏈接更多精彩內(nèi)容