全網最詳細的一篇Flutter 尺寸限制類容器總結
Flutter中尺寸限制類容器元件包括ConstrainedBox、UnconstrainedBox、SizedBox、AspectRatio、FractionallySizedBox、LimitedBox、Container。這些元件可以約束子元件的尺寸,下面一一介紹。
ConstrainedBox
ConstrainedBox元件約束子元件的最大寬高和最小寬高,假如一個元件寬高都是300,包裹在ConstrainedBox中,並給ConstrainedBox新增最大寬高約束,用法如下:
ConstrainedBox(
constraints: BoxConstraints(maxHeight: 60, maxWidth: 200),
child: Container(height: 300, width: 300, color: Colors.red),
)
這時子元件是無法突破BoxConstraints設定的最大寬高,效果如下:
BoxConstraints的預設值如下:
const BoxConstraints({
this.minWidth = 0.0,
this.maxWidth = double.infinity, //無限大
this.minHeight = 0.0,
this.maxHeight = double.infinity, //無限大
});
BoxConstraints提供了便捷的構建函式,方便開發者呼叫,如BoxConstraints.tight(Size size)
和BoxConstraints.expand()
等。
如果BoxConstraints巢狀使用,有2個ConstrainedBox,如下:
ConstrainedBox(
constraints: BoxConstraints(maxHeight: 60, maxWidth: 200),
child: ConstrainedBox(
constraints: BoxConstraints(maxHeight: 100, maxWidth: 240),
child: Container(height: 300, width: 300, color: Colors.red),
),
)
以最大寬為例,第一個BoxConstraints的maxHeight
值是60,也就是約束其子控制元件最大高是60,第二個BoxConstraints的maxHeight
值是100,由於第二個BoxConstraints也受第一個的約束,所以第二個BoxConstraints最大高也只能是60,最終子元件的最大高是60,同理最大寬是200,因此多級BoxConstraints巢狀約束最大值最終值等於多個BoxConstraints約束中的最小值。同理巢狀約束最小值等於多個BoxConstraints約束中的最大值。
UnconstrainedBox
UnconstrainedBox元件不對子元件做任何約束,比如有一個父元件大小是200x200,子元件是UnconstrainedBox,UnconstrainedBox包裹一個300x300的元件,程式碼如下:
Container(
height: 200,
width: 200,
child: UnconstrainedBox(
child: Container(height: 300, width: 300, color: Colors.red),
),
)
效果如下:
注意:黃色區域表示子控制元件超出父控制元件的區域了,黃色區域只會在debug模式下存在,在release模式下,只有紅色區域。
UnconstrainedBox雖然不限制其子控制元件的大小,但仍然受父控制元件的約束,超出父控制元件的區域將會擷取。
UnconstrainedBox允許設定對齊方式,用法如下:
UnconstrainedBox(
alignment: Alignment.topLeft,
...
)
效果如下:
和上一個圖對比,這次左邊和上邊沒有超出區域,右邊和下邊各超出100px。
SizedBox
SizedBox是具有固定寬高的元件,直接指定具體的寬高,用法如下:
SizedBox(
height: 60,
width: 200,
child: RaisedButton(
child: Text('this is SizedBox'),
),
)
我們也可以設定尺寸無限大,如下:
SizedBox(
height: double.infinity,
width: double.infinity,
...
)
雖然設定了無限大,子控制元件是否會無限長呢?不,不會,子控制元件依然會受到父元件的約束,會擴充套件到父元件的尺寸,還有一個便捷的方式設定此方式:
SizedBox.expand(
child: RaisedButton(
child: Text('this is SizedBox'),
),
)
SizedBox可以沒有子元件,但仍然會佔用空間,所以SizedBox非常適合控制2個元件之間的空隙,用法如下:
Column(
children: <Widget>[
Container(height: 30,),
SizedBox(height: 10,),
Container(height: 30,),
],
)
AspectRatio
AspectRatio元件是固定寬高比的元件,如果元件的寬度固定,希望高是寬的1/2,可以用AspectRatio實現此效果,用法如下:
AspectRatio(
aspectRatio: 2 / 1,
child: Container(color: Colors.red),
)
aspectRatio
引數是寬高比,可以直接寫成分數的形式,也可以寫成小數的形式,但建議寫成分數的形式,可讀性更高。效果如下:
FractionallySizedBox
當我們需要一個控制元件的尺寸是相對尺寸時,比如當前按鈕的寬度佔父元件的70%,可以使用FractionallySizedBox來實現此效果。
使用FractionallySizedBox包裹子控制元件,設定widthFactor
寬度係數或者heightFactor
高度係數,係數值的範圍是0-1,0.7表示佔父元件的70%,用法如下:
FractionallySizedBox(
widthFactor: .7,
child: RaisedButton(
child: Text('button'),
),
)
透過alignment
引數控制子元件顯示的位置,預設為center
,用法如下:
FractionallySizedBox(
alignment: Alignment.centerLeft,
...
)
如果想讓2個控制元件之間的間隔是當前父控制元件的10%,可以使用無子控制元件的FractionallySizedBox,用法如下:
Container(
height: 200,
color: Colors.grey,
child: Column(
children: <Widget>[
Container(
height: 50,
color: Colors.red,
),
Flexible(
child: FractionallySizedBox(
heightFactor: .1,
),
),
Container(
height: 50,
color: Colors.blue,
),
],
),
)
效果如下:
LimitedBox
LimitedBox元件是當不受父元件約束時限制它的尺寸,什麼叫不受父元件約束?就像這篇文章介紹的其他元件,它們都會對子元件約束,沒有約束的父元件有ListView、Row、Column等,如果LimitedBox的父元件受到約束,此時LimitedBox將會不做任何操作,我們可以認為沒有這個元件,程式碼如下:
Container(
height: 100,
width: 100,
child: LimitedBox(
maxHeight: 50,
maxWidth: 100,
child: Container(color: Colors.green,),
),
)
效果如下:
LimitedBox設定的寬高不是正方形,此時效果時正方形,說明LimitedBox沒有起作用。
在ListView中直接新增Container元件,如下:
ListView(
children: <Widget>[
Container(
color: Colors.green,
),
Container(
color: Colors.red,
),
],
)
這時你會發現什麼也沒有,因為在容器不受約束時,大小將會設定0,只需將Container包裹在LimitedBox中即可:
ListView(
children: <Widget>[
LimitedBox(
maxHeight: 100,
child: Container(
color: Colors.green,
),
),
LimitedBox(
maxHeight: 100,
child: Container(
color: Colors.red,
),
),
],
)
效果:
Container
Container元件應該是最常用的元件之一,Container元件可以直接設定其寬高,用法如下:
Container(
height: 100,
width: 100,
...
)
Container元件是這些元件裡面屬性最多的一個,當然也是用法最複雜的一個,這裡重點介紹Container對子元件的約束,我在前面的文章中已經詳細的介紹了Container,這裡不在介紹,奉上跳轉地址:https://blog.csdn.net/mengks1987/article/details/104388393
總結
這麼多約束類的容器元件,到底要使用哪一個元件呢?總結如下:
- ConstrainedBox:適用於需要設定最大/小寬高,元件大小以來子元件大小,但不能超過設定的界限。
- UnconstrainedBox:用到情況不多,當作ConstrainedBox的子元件可以“突破”ConstrainedBox的限制,超出界限的部分會被擷取。
- SizedBox:適用於固定寬高的情況,常用於當作2個元件之間間隙元件。
- AspectRatio:適用於固定寬高比的情況。
- FractionallySizedBox:適用於佔父元件百分比的情況。
- LimitedBox:適用於沒有父元件約束的情況。
- Container:適用於不僅有尺寸的約束,還有裝飾(顏色、邊框、等)、內外邊距等需求的情況。
今天的文章對大家是否有幫助?如果有,請在文章底部留言和點贊,以表示對我的支援,你們的留言、點贊和轉發關注是我持續更新的動力!
更多相關閱讀:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1762/viewspace-2824981/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java-全網最詳細反射Java反射
- 全網最詳細的Spring入門教程Spring
- 全網最詳細的PyCharm+Anaconda的安裝。PyCharm
- 可能是全網最詳細的express--middlewareExpress
- 全網最詳細的負載均衡原理圖解負載圖解
- Docker版Grafana整合InfluxDB看這一篇就夠了(2020全網最詳細教程)DockerGrafanaUX
- RestTemplate全網最強總結(永久更新)REST
- phpRedis函式使用總結【分類詳細】PHPRedis函式
- java面試題總結-詳細分類Java面試題
- 全網最詳細的ReentrantReadWriteLock原始碼剖析(萬字長文)原始碼
- 年底晉升,全網最詳細的通關指南來了!
- 全網最詳細的AbstractQueuedSynchronizer(AQS)原始碼剖析(一)AQS基礎AQS原始碼
- 全網最詳細最齊全的序列化技術及深度解析與應用實戰
- win10網速限制解除的詳細教程Win10
- 全網最詳細解讀《GIN-HOW POWERFUL ARE GRAPH NEURAL NETWORKS》!!!
- 全網最詳細的AbstractQueuedSynchronizer(AQS)原始碼剖析(三)條件變數AQS原始碼變數
- float浮動的詳細總結
- Mac版最詳細的Flutter開發環境搭建MacFlutter開發環境
- 最棒 Spring Boot 乾貨總結(超詳細,建議收藏)Spring Boot
- 全網最細 | 教你如何在 docker 容器下使用 mmdetection 訓練自己的資料集Docker
- Flutter 裁剪類元件 最全總結Flutter元件
- JVM類載入機制詳解,建議看這一篇就夠了,深入淺出總結的十分詳細!JVM
- H5網頁應用打包安卓App (全網最詳細教程)H5網頁安卓APP
- 這或許是最詳細的JUC多執行緒併發總結執行緒
- 這應該是全網最詳細的Vue3.5版本解讀Vue
- 全網最詳細4W字Flink全面解析與實踐(下)
- 大模型演算法辦備案全網最詳細說明(+附件)大模型演算法
- flutter 總結: 通過 GlobalKey 獲取介面任意元素座標尺寸Flutter
- [總結] 容器技術架構、網路和生態詳解架構
- 全網最全Flutter常用工具類Flutter
- Oracle Partition 分割槽詳細總結Oracle
- JAVA物件導向詳細總結Java物件
- 全網最詳細的AbstractQueuedSynchronizer(AQS)原始碼剖析(二)資源的獲取和釋放AQS原始碼
- 詳細展示RNN的網路結構RNN
- 以下關於CISC和RISC的敘述中,錯誤的是()【最全!最詳細總結!】
- 全網最全Spring面試題之基礎篇整理總結(共69題,附超詳細解答)Spring面試題
- Flutter 初探(三):容器類WidgetsFlutter
- Flutter學習總結系列----Flutter基礎全面詳解Flutter