【Flutter 2-12】Flutter手把手教程UI佈局和Widg
作者 | 弗拉德
來源 | 弗拉德
GridView
GridView
是一個好用的網格佈局控制元件,它的很多屬性跟前面提到的ListView是一樣的,重複的屬性這裡就不贅述了。我們重點了解初始化方法GridView.count
的使用,還有兩個代理SliverGridDelegateWithFixedCrossAxisCount
、SliverGridDelegateWithMaxCrossAxisExtent
的引數以及使用。
GridView.count
我們先來看GridView.count
的建構函式
GridView.count({
/// key
Key key,
/// 佈局方向
Axis scrollDirection = Axis.vertical,
/// 是否 倒序顯示
bool reverse = false,
/// ScrollController用於控制滾動位置和監聽滾動事件
ScrollController controller,
/// 是否使用預設的controller
bool primary,
/// 滾動效果 可以透過此引數 設定 GridView 不可滾動
ScrollPhysics physics,
/// 是否根據子控制元件的總長度來設定 GridView 的長度,預設值為false
bool shrinkWrap = false,
/// padding
EdgeInsetsGeometry padding,
/// 交叉軸 子控制元件的個數
int crossAxisCount,
/// 主軸方向的間距
double mainAxisSpacing = 0.0,
/// 交叉軸方向子元素的間距
double crossAxisSpacing = 0.0,
/// 子控制元件的寬高比例
double childAspectRatio = 1.0,
// 在 關閉螢幕時 是否釋放子控制元件
bool addAutomaticKeepAlives = true,
/// 是否 避免列表項重繪
bool addRepaintBoundaries = true,
/// 該屬性表示是否把子控制元件包裝在IndexedSemantics裡,用來提供無障礙語義
bool addSemanticIndexes = true,
// 預載入子控制元件的個數
double cacheExtent,
/// 子控制元件的陣列
List<Widget> children = const <Widget>[],
/// 子控制元件的數量
int semanticChildCount,
DragStartBehavior dragStartBehavior = DragStartBehavior.start,
ScrollViewKeyboardDismissBehavior keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual,
})
這裡要說的是有兩個比較重要的引數crossAxisSpacing
和childAspectRatio
,這個兩個引數是用來定義子控制元件大小的。
假如我們設定 crossAxisSpacing = 2
,那麼每一行就會顯示2
個控制元件,而且控制元件的高度由childAspectRatio
來確定。
childAspectRatio
表示子控制元件的寬高比,假如我們設定為2 / 3
,那麼高就是寬的1.5倍,這樣就可以計運算元控制元件的大小了,並且按照 GridView
設定好的方向來排列和佈局子控制元件。
GridView.count(
crossAxisCount: 3,
childAspectRatio: 2 / 3,
children: List.generate(
50,
(index) {
return Card(
child: Container(
color: Colors.green,
child: Center(
child: Text("$index"),
),
),
);
},
),
)
效果圖如下:
SliverGridDelegateWithFixedCrossAxisCount
除了GridView.count()
這種構造方法,我們很多時候常用一個構造方法是GridView.builder(gridDelegate: itemBuilder:)
,它接收一個delegate
物件,並且跟ListView
一樣接收一個itemBuilder
方法。
SliverGridDelegateWithFixedCrossAxisCount
的構造方法如下:
SliverGridDelegateWithFixedCrossAxisCount({
this.crossAxisCount,
this.mainAxisSpacing = 0.0,
this.crossAxisSpacing = 0.0,
this.childAspectRatio = 1.0,
})
可以看得出來它是把GridView.count()
的幾個引數封裝了一下,具體的用法和效果跟GridView.count()
一樣,這裡就不贅述了。
SliverGridDelegateWithFixedCrossAxisCount
在很多情況下都能滿足我們的佈局需求,但是有一個不足,因為它設定的每一行數是一個定值。
當我們把螢幕旋轉,此時原來的高度會變為現在的寬度,效果就會如下:
所以我們可以使用下面delegate
來解決這個問題。
SliverGridDelegateWithMaxCrossAxisExtent
我們可以在GridView.builder(gridDelegate: itemBuilder:)
方法內傳入另外一個引數SliverGridDelegateWithMaxCrossAxisExtent
構造方法如下:
const SliverGridDelegateWithMaxCrossAxisExtent({
this.maxCrossAxisExtent,
this.mainAxisSpacing = 0.0,
this.crossAxisSpacing = 0.0,
this.childAspectRatio = 1.0,
})
這裡有一個比較重要的引數就是maxCrossAxisExtent
,這個值表示的是子控制元件最大的寬度是多少。
舉個例子:
手機的螢幕寬度為375
,子控制元件之間的間距為0
,maxCrossAxisExtent
的值設定為100
,那麼我們知道子控制元件的寬度取值區間在0~100
之間。
-
假設我們佈局
3
個子控制元件,3
乘以最大值100
等於300
,很明顯是不能滿足佈局在375
的寬度上的。 -
假設我們佈局
4
個子控制元件,4
乘以100
等於400
,400
大於375
。我們知道寬度的取值區間在0~100
,375 / 4 = 93.75
既滿足了寬度小於100
,又滿足了可以充滿375
的寬度,那麼子控制元件的個數為4
寬度為93.75
這就是maxCrossAxisExtent
的用法。
其實GridView
還可以做瀑布流效果,感興趣的同學可以去查一下。
想體驗以上的示例的執行效果,可以到[我的Github倉庫] github.com/Johnson8888/learn_flutter 專案flutter_app
->lib
->routes
->gridview_page.dart
檢視,並且可以下載下來執行並體驗。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2144/viewspace-2826869/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Flutter 1-16】Flutter手把手教程UI佈局和Widget——容器控制元件ContainerFlutterUI控制元件AI
- Flutter學習指南:UI佈局和控制元件FlutterUI控制元件
- Flutter 佈局Flutter
- Flutter 常用佈局Flutter
- Flutter | 佈局元件Flutter元件
- Flutter 佈局篇 Positioned 和 ContainerFlutterAI
- Flutter線性佈局Row和ColumnFlutter
- Flutter 佈局真經Flutter
- Flutter 佈局詳解Flutter
- flutter瀑布流佈局Flutter
- Flutter佈局——Flex、FittedBox、Stack、Container佈局教程【超詳細】FlutterFlexAI
- Flutter佈局和繪製流程淺析Flutter
- flutter系列之:在flutter中使用流式佈局Flutter
- flutter學習日記(二)————flutter的佈局和頁面元件Flutter元件
- [譯] MDC-102 Flutter:Material 結構和佈局(Flutter)Flutter
- Flutter框架分析(六)-- 佈局Flutter框架
- Flutter 簡單佈局技巧Flutter
- flutter佈局-1-columnFlutter
- flutter佈局-2-rowFlutter
- flutter佈局-3-centerFlutter
- Flutter佈局之標題Flutter
- Flutter 佈局之企鵝電競Flutter
- 手把手教你在Android專案中接入Flutter,在Flutter中使用Android佈局AndroidFlutter
- [譯] Flutter 佈局備忘錄Flutter
- Flutter自定義佈局-CustomMultiChildLayoutFlutter
- flutter佈局-4-containerFlutterAI
- flutter佈局-6-MaterialAppFlutterAPP
- Flutter佈局篇(1)–水平和垂直佈局詳解Flutter
- Flutter佈局篇(1)--水平和垂直佈局詳解Flutter
- Flutter之在Flutter佈局中嵌入原生元件Android篇Flutter元件Android
- Flutter開發日記——Flutter佈局Widget詳解(上)Flutter
- Flutter開發日記——Flutter佈局Widget詳解(下)Flutter
- Flutter原始碼閱讀(3)-Flutter的佈局與hitTestFlutter原始碼
- Flutter你竟是這樣的佈局Flutter
- Flutter學習之”相對佈局“Flutter
- Flutter實戰之基本佈局篇Flutter
- 【Flutter 基礎】 檢視佈局-前言Flutter
- Flutter 佈局(七)- Row、Column詳解Flutter