【Flutter 2-9】Flutter手把手教程UI布局和Widget——彈性布局控件Flexible

作者 | 弗拉德
來源 | 弗拉德(公眾號:fulade_me)

Flexible

Flexible可以幫助Row、Column边酒、Flex的子控件充滿父控件钧汹,它的用法很靈活扇苞,也具有權重的屬性据某。跟Flexible相類似的控件還有Expanded橡娄。
先來看Flexible的構造函數(shù)

const Flexible({
    /// key
    Key key,
    // 默認 flex 的值為 1
    this.flex = 1,
    /// 默認 fit參數(shù)為 FlexFit.loose 表示子控件可以以最小的大小來布局
    this.fit = FlexFit.loose,
    @required Widget child,
}) 

按比例布局

Flexible的參數(shù)flex是表示比例的值。
假如我們在Column內(nèi)部有三個子控件哗脖,每個控件的flex值都設置為1
那么這三個子控件的高度都是Column高度(Row的情況下就是寬度)的三分之一瀑踢,也就是三個子控件均分了Column的高度(Row的情況下就是寬度)

Column(
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
    ],
)

如下圖:

2020_01_14_flexible_1_1_1

然后我們把flex的值分別設置為1扳还、2才避、3,那么這個三個控件的高度分別是五分之一氨距、五分之二桑逝、五分之三的高度

Column(
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 2,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 3,
        ),
    ],
)

效果如下圖:


2020_01_14_flexible_1_2_3

FlexFit.loose 和 FlexFit.tight

枚舉值 描述
loose loose表示允許以最小的高度(Row下是寬度)布局 可以忽略flex的值
tight 必須以設置的最大的flex值來顯示
Column(
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset(
            "images/image_demo.jpg",
            height: 80,
            ),
            fit: FlexFit.loose,
            flex: 2,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 2,
        ),
    ],
)

我們給第二個控件設置的flex值為2,給Image設置的高度為80俏让,給fit的值設置為FlexFit.loose楞遏,這個時候優(yōu)先起到作用的是FlexFit.loose茬暇,flex的值會被忽略,所以這里的Image會以高度為80的大小來顯示寡喝。
效果如下圖:

2020_01_14_flexible_loose

Column(
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset(
            "images/image_demo.jpg",
            height: 80,
            ),
            fit: FlexFit.tight,
            flex: 2,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 2,
        ),
    ],
)

我們把FlexFit.loose改為FlexFit.tight糙俗,此時就會忽略當前設置的高度80,直接使用比例來顯示预鬓。
效果如下圖:

2020_01_14_flexible_tight

優(yōu)先布局

如果我們將flex的值設置為0巧骚,此時Flexible并不是被分配0的高度,而是flex值為0的Flexible會優(yōu)先布局且會盡量大的占用Column的高度

Column(
    children: [
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 2,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 0,
        ),
    ],
)

2020_01_14_flexible_flex_00

可以看到第三個Flexible是高度最大的格二,因為它優(yōu)先占用最高的高度劈彪。

填充剩余的空間

很多情況下在Column內(nèi)不止是有Flexible控件,還有像Container這種控件顶猜。在二者都存在的情況下沧奴,Container會優(yōu)先布局并占用自己需要的高度,剩余的高度由Flexible控件來填充滿长窄。如果有多個Flexible控件滔吠,它們會按自己設置的flex值來均分剩余的高度。

Column(
    children: [
        Container(
            child: Image.asset("images/image_demo.jpg"),
            width: 100,
            height: 100,
        ),
        Container(
            child: Image.asset("images/image_demo.jpg"),
            width: 100,
            height: 100,
        ),
        Flexible(
            child: Container(
                decoration: BoxDecoration(color: Colors.green),
                width: 300,
            ),
        ),
    ],
)

效果如下:

2020_01_14_flexible_flex_space_full

想體驗以上示例的運行效果挠日,可以到我的Github倉庫項目flutter_app->lib->routes->flexible_page.dart查看屠凶,并且可以下載下來運行并體驗。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肆资,一起剝皮案震驚了整個濱河市矗愧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌郑原,老刑警劉巖唉韭,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異犯犁,居然都是意外死亡属愤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門酸役,熙熙樓的掌柜王于貴愁眉苦臉地迎上來住诸,“玉大人,你說我怎么就攤上這事涣澡〖牛” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵入桂,是天一觀的道長奄薇。 經(jīng)常有香客問我,道長抗愁,這世上最難降的妖魔是什么馁蒂? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任呵晚,我火速辦了婚禮,結果婚禮上沫屡,老公的妹妹穿的比我還像新娘饵隙。我一直安慰自己,他們只是感情好沮脖,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布癞季。 她就那樣靜靜地躺著,像睡著了一般倘潜。 火紅的嫁衣襯著肌膚如雪绷柒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天涮因,我揣著相機與錄音废睦,去河邊找鬼。 笑死养泡,一個胖子當著我的面吹牛嗜湃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澜掩,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼购披,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肩榕?” 一聲冷哼從身側響起刚陡,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎株汉,沒想到半個月后筐乳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡乔妈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年蝙云,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片路召。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡勃刨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出股淡,到底是詐尸還是另有隱情身隐,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布揣非,位于F島的核電站抡医,受9級特大地震影響躲因,放射性物質(zhì)發(fā)生泄漏早敬。R本人自食惡果不足惜忌傻,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搞监。 院中可真熱鬧水孩,春花似錦、人聲如沸琐驴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绝淡。三九已至宙刘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牢酵,已是汗流浹背悬包。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馍乙,地道東北人布近。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像丝格,于是被迫代替她去往敵國和親撑瞧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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