全網最詳細的一篇Flutter 尺寸限制類容器總結
阿新 • • 發佈:2020-03-05
![](https://img2020.cnblogs.com/blog/467322/202003/467322-20200305204617885-633726884.png)
Flutter中尺寸限制類容器元件包括ConstrainedBox、UnconstrainedBox、SizedBox、AspectRatio、FractionallySizedBox、LimitedBox、Container。這些元件可以約束子元件的尺寸,下面一一介紹。
## ConstrainedBox
ConstrainedBox元件約束子元件的最大寬高和最小寬高,假如一個元件寬高都是300,包裹在ConstrainedBox中,並給ConstrainedBox新增最大寬高約束,用法如下:
```dart
ConstrainedBox(
constraints: BoxConstraints(maxHeight: 60, maxWidth: 200),
child: Container(height: 300, width: 300, color: Colors.red),
)
```
這時子元件是無法突破BoxConstraints設定的最大寬高,效果如下:
![](https://img2020.cnblogs.com/blog/467322/202003/467322-20200305204618205-769794437.png)
BoxConstraints的預設值如下:
```dart
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,如下:
```dart
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的元件,程式碼如下:
```dart
Container(
height: 200,
width: 200,
child: UnconstrainedBox(
child: Container(height: 300, width: 300, color: Colors.red),
),
)
```
效果如下:
![](https://img2020.cnblogs.com/blog/467322/202003/467322-20200305204618681-528288153.png)
注意:黃色區域表示子控制元件超出父控制元件的區域了,黃色區域只會在debug模式下存在,在release模式下,只有紅色區域。
UnconstrainedBox雖然不限制其子控制元件的大小,但仍然受父控制元件的約束,超出父控制元件的區域將會擷取。
UnconstrainedBox允許設定對齊方式,用法如下:
```dart
UnconstrainedBox(
alignment: Alignment.topLeft,
...
)
```
效果如下:
![](https://img2020.cnblogs.com/blog/467322/202003/467322-20200305204618833-2140725418.png)
和上一個圖對比,這次左邊和上邊沒有超出區域,右邊和下邊各超出100px。
## SizedBox
SizedBox是具有固定寬高的元件,直接指定具體的寬高,用法如下:
```dart
SizedBox(
height: 60,
width: 200,
child: RaisedButton(
child: Text('this is SizedBox'),
),
)
```
我們也可以設定尺寸無限大,如下:
```dart
SizedBox(
height: double.infinity,
width: double.infinity,
...
)
```
雖然設定了無限大,子控制元件是否會無限長呢?不,不會,子控制元件依然會受到父元件的約束,會擴充套件到父元件的尺寸,還有一個便捷的方式設定此方式:
```dart
SizedBox.expand(
child: RaisedButton(
child: Text('this is SizedBox'),
),
)
```
SizedBox可以沒有子元件,但仍然會佔用空間,所以SizedBox非常適合控制2個元件之間的空隙,用法如下:
```dart
Column(
ch