1. 程式人生 > >【Flutter實戰】定位裝飾權重元件及柱狀圖案例

【Flutter實戰】定位裝飾權重元件及柱狀圖案例

![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205753476-2102277305.png) > 老孟導讀:Flutter中有這麼一類元件,用於定位、裝飾、控制子元件,比如 **Container** (定位、裝飾)、**Expanded** (擴充套件)、**SizedBox** (固定尺寸)、**AspectRatio** (寬高比)、**FractionallySizedBox** (佔父元件比例)。這些元件的使用頻率非常高,下面一一介紹,最後給出專案中實際案例熟悉其用法。 > 【Flutter實戰】系列文章地址:[http://laomengit.com/guide/introduction/mobile_system.html](http://laomengit.com/guide/introduction/mobile_system.html) ### Container **Container** 是最常用的元件之一,它是單容器類元件,即僅能包含一個子元件,用於裝飾和定位子元件,例如設定背景顏色、形狀等。 最簡單的用法如下: ```dart Container( child: Text('老孟'), ) ``` 子元件不會發生任何外觀上的變化: ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205754001-1238293419.png) 設定背景顏色: ```dart Container( color: Colors.blue, child: Text('老孟'), ) ``` ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205754191-1030652428.png) 設定內邊距( **padding** ) 和 外邊距( **margin** ) ```dart Container( color: Colors.blue, child: Container( margin: EdgeInsets.all(10), padding: EdgeInsets.all(20), color: Colors.red, child: Text('老孟'), ), ) ``` 效果如下: ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205756607-942871480.webp) **decoration** 屬性設定子元件的背景顏色、形狀等。設定背景為圓形,顏色為藍色: ```dart Container( child: Text('老孟,專注分享Flutter技術及應用'), decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.blue), ) ``` ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205757446-464101806.webp) 預設情況下,圓形的直徑等於 **Container** 窄邊長度,相當於在矩形內繪製內切圓。 上面的情況明顯不是我們希望看到了,希望背景是圓角矩形: ```dart Container( child: Text('老孟,專注分享Flutter技術及應用'), padding: EdgeInsets.symmetric(horizontal: 10), decoration: BoxDecoration( shape: BoxShape.rectangle, borderRadius: BorderRadius.all(Radius.circular(20)), color: Colors.blue), ) ``` ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205758380-723818491.webp) 除了背景我們可以設定邊框效果,程式碼如下: ```dart Container( child: Text('老孟,專注分享Flutter技術及應用'), padding: EdgeInsets.symmetric(horizontal: 10), decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), border: Border.all( color: Colors.blue, width: 2, ), ), ) ``` ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205759311-1357026911.webp) 建立圓角圖片和圓形圖片: ```dart Container( height: 200, width: 200, decoration: BoxDecoration( image: DecorationImage( image: NetworkImage( 'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg'), fit: BoxFit.cover, ), border: Border.all( color: Colors.blue, width: 2, ), borderRadius: BorderRadius.circular(12), ), ) ``` ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205800628-2066249275.webp) 修改其形狀為圓形,程式碼如下: ```dart Container( height: 200, width: 200, decoration: BoxDecoration( image: DecorationImage( image: NetworkImage( 'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg'), fit: BoxFit.cover, ), border: Border.all( color: Colors.blue, width: 2, ), shape: BoxShape.circle, ), ) ``` ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205801585-1223791547.webp) 設定對齊方式為居中,背景色為藍色,程式碼如下: ``` Container( color: Colors.blue, child: Text('老孟,一個有態度的程式設計師'), alignment: Alignment.center, ) ``` ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205802407-616639988.webp) > 注意:設定對齊方式後,Container將會充滿其父控制元件,相當於Android中 **match_parent** 。 **Alignment** 已經封裝了常用的位置, ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205803824-797275686.webp) 通過名字就知道其位置,這裡要介紹一下其他的位置,比如在距離左上角1/4處: ```dart Container( alignment: Alignment(-.5,-.5), child: Text('老孟,專注分享Flutter技術及應用'), ) ``` 所以這裡有一個非常重要的座標系,Alignment 座標系如下: ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205804411-786937675.webp) 元件的中心為座標原點。 設定固定的寬高屬性: ```dart Container( color: Colors.blue, child: Text('老孟,專注分享Flutter技術及應用'), alignment: Alignment.center, height: 60, width: 250, ) ``` ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205805376-1784953282.webp) 通過 **constraints** 屬性設定最大/小寬、高來確定大小,如果不設定,預設最小寬高是0,最大寬高是無限大(double.infinity),約束width程式碼如下: ```dart Container( color: Colors.blue, child: Text('老孟,專注分享Flutter技術及應用'), alignment: Alignment.center, constraints: BoxConstraints( maxHeight: 100, maxWidth: 300, minHeight: 100, minWidth: 100, ), ) ``` ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205807232-13496837.webp) 通過transform可以旋轉、平移、縮放Container,旋轉程式碼如下: ```dart Container( color: Colors.blue, child: Text('老孟,專注分享Flutter技術及應用'), alignment: Alignment.center, height: 60, width: 250, transform: Matrix4.rotationZ(0.5), ) ``` > 注意:Matrix4.rotationZ()引數的單位是弧度而不是角度 ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205808192-853125986.webp) ### SizedBox **SizedBox** 是具有固定寬高的元件,直接指定具體的寬高,用法如下: ```dart SizedBox( height: 60, width: 200, child: Container( color: Colors.blue, alignment: Alignment.center, child: Text('老孟,專注分享Flutter技術及應用'), ), ) ``` ![](https://img2020.cnblogs.com/other/467322/202006/467322-20200622205809349-1658326412.webp) 設定尺寸無限大,如下: ```dart SizedBox( height: double.infinity, width: double.infinity, ... ) ``` 雖然設定了無限大,子控制元件是否會無限長呢?不,不會,子控制元件依然會受到父元件的約束,會擴充套件到父元件的尺寸,還有一個便捷的方式設定此方式: ```dart SizedBox.expand( child: Text('老孟,專注分享Flutter技術及應用'), ) ``` SizedBox 可以沒有子元件,但仍然會佔用空間,所以 SizedBox 非常適合控制2個元件之間的空隙,用法如下: ```dart Column( ch