作者 | 弗拉德
來源 | 弗拉德(公眾號: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,
),
],
)
如下圖:
然后我們把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,
),
],
)
效果如下圖:
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
的大小來顯示寡喝。
效果如下圖:
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
,直接使用比例來顯示预鬓。
效果如下圖:
優(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,
),
],
)
可以看到第三個
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,
),
),
],
)
效果如下:
想體驗以上示例的運行效果挠日,可以到我的Github倉庫項目flutter_app
->lib
->routes
->flexible_page.dart
查看屠凶,并且可以下載下來運行并體驗。