一個可滾動的2D排列的小部件扮超。
控件網(wǎng)格的主軸方向是它滾動的方向( scrollDirection)帖池。
最常用的網(wǎng)格布局是 GridView.count年扩,它創(chuàng)建了一個在橫軸上具有固定數(shù)量 網(wǎng)格塊 的平鋪的布局,和 GridView.extent 雷激,它使用具有最大橫軸范圍的 網(wǎng)格塊 創(chuàng)建布局替蔬。自定義 SliverGridDelegate 可以生成任意2D排列的子代,包括未對齊或重疊的排列屎暇。
要創(chuàng)建具有大量(或無限)個子節(jié)點的網(wǎng)格承桥,請將 GridView.builder 構(gòu)造函數(shù)與gridDelegate 的 SliverGridDelegateWithFixedCrossAxisCount 或 SliverGridDelegateWithMaxCrossAxisExtent 一起使用。
要使用自定義SliverChildDelegate 恭垦,請使用 GridView.custom快毛。
要創(chuàng)建線性數(shù)組的子代格嗅,請使用 ListView番挺。
若要控制滾動視圖的初始滾動偏移,請為控制器 controller 提供其ScrollController.initialScrollOffset 屬性集屯掖。
轉(zhuǎn)換到CustomScrollView
GridView基本上是一個 CustomScrollView 玄柏,其 CustomScrollView.slivers 中包含一個SliverGrid。
如果GridView不再足夠贴铜,例如因為滾動視圖既有網(wǎng)格又有列表粪摘,或者因為網(wǎng)格要與 SliverAppBar 等組合在一起,直接將代碼從使用 GridView 移植到 CustomScrollView 直接使用绍坝。
CustomScrollView.slivers 屬性只能使用包含 SliverGrid 的列表徘意。
GridView上 的 childrenDelegate 屬性對應(yīng)于 SliverGrid.delegate 屬性,GridView上 的 gridDelegate 屬性對應(yīng)于 SliverGrid.gridDelegate 屬性轩褐。
GridView椎咧,GridView.count和GridView.extent構(gòu)造函數(shù)的子參數(shù)對應(yīng)于 GridView 中 childrenDelegate 是具有相同參數(shù)的 SliverChildListDelegate。
GridView.builder 構(gòu)造函數(shù)的 itemBuilder 和 childCount 參數(shù)對應(yīng)于 GridView 中的 childrenDelegate把介,它們是具有匹配參數(shù)的 SliverChildBuilderDelegate
GridView.count 和 GridView.extent 構(gòu)造函數(shù)創(chuàng)建自定義網(wǎng)格委托勤讽,并在 SliverGrid上 具有等效命名的構(gòu)造函數(shù)以簡化轉(zhuǎn)換:分別為 SliverGrid.count 和 SliverGrid.extent。
padding 屬性對應(yīng)于在 CustomScrollView.slivers 屬性中使用 SliverPadding 而不是網(wǎng)格本身拗踢,并且讓 SliverGrid 成為 SliverPadding 的子級脚牍。
默認情況下,ListView將自動填充列表的可滾動范圍巢墅,以避免MediaQuery的padding 造成的部分障礙诸狭。要避免此行為券膀,請使用padding屬性為0進行覆蓋。
將代碼移植到使用CustomScrollView后作谚,可以將其他slivers(例如 SliverList 或 SliverAppBar)放入CustomScrollView.slivers 中三娩。
以下是使用 CustomScrollView 顯示 GridView 等效的代碼片段:
GridView.count(
primary: false,
padding: const EdgeInsets.all(20.0),
crossAxisSpacing: 10.0,
crossAxisCount: 2,
children: <Widget>[
const Text('He\'d have you all unravel at the'),
const Text('Heed not the rabble'),
const Text('Sound of screams but the'),
const Text('Who scream'),
const Text('Revolution is coming...'),
const Text('Revolution, they...'),
],
)
CustomScrollView(
primary: false,
slivers: <Widget>[
SliverPadding(
padding: const EdgeInsets.all(20.0),
sliver: SliverGrid.count(
crossAxisSpacing: 10.0,
crossAxisCount: 2,
children: <Widget>[
const Text('He\'d have you all unravel at the'),
const Text('Heed not the rabble'),
const Text('Sound of screams but the'),
const Text('Who scream'),
const Text('Revolution is coming...'),
const Text('Revolution, they...'),
],
),
),
],
)
也可以看看:
- SingleChildScrollView,它是一個具有單個子項的可滾動窗口小部件妹懒。
- ListView雀监,它是可滾動的,線性的小部件列表眨唬。
- PageView会前,這是一個滾動列表,頁面視圖的每個子項大小都被強制與視口大小相同匾竿。
- CustomScrollView瓦宜,這是一個可滾動的小部件,使Slivers用創(chuàng)建自定義滾動效果岭妖。
- SliverGridDelegateWithFixedCrossAxisCount临庇,它創(chuàng)建一個在橫軸上具有固定數(shù)量的 網(wǎng)格塊 的布局。
- SliverGridDelegateWithMaxCrossAxisExtent昵慌,用于創(chuàng)建具有最大橫軸范圍的 網(wǎng)格塊 的布局假夺。
- ScrollNotification 和 NotificationListener,可用于在不使用 ScrollController 的情況下查看滾動位置斋攀。
構(gòu)造函數(shù)
使用自定義SliverGridDelegate創(chuàng)建可滾動的2D小部件數(shù)組
GridView({Key key, Axis scrollDirection: Axis.vertical, bool reverse: false, ScrollController controller, bool primary, ScrollPhysics physics, bool shrinkWrap: false, EdgeInsetsGeometry padding, @required SliverGridDelegate gridDelegate, bool addAutomaticKeepAlives: true, bool addRepaintBoundaries: true, bool addSemanticIndexes: true, double cacheExtent, List<Widget> children: const <widget>[]</widget>, int semanticChildCount })
創(chuàng)建 按需創(chuàng)建的可滾動的2D小部件數(shù)組
GridView.builder({Key key, Axis scrollDirection: Axis.vertical, bool reverse: false, ScrollController controller, bool primary, ScrollPhysics physics, bool shrinkWrap: false, EdgeInsetsGeometry padding, @required SliverGridDelegate gridDelegate, @required IndexedWidgetBuilder itemBuilder, int itemCount, bool addAutomaticKeepAlives: true, bool addRepaintBoundaries: true, bool addSemanticIndexes: true, double cacheExtent, int semanticChildCount })
創(chuàng)建一個可滾動的2D小部件數(shù)組已卷,在橫軸上具有固定數(shù)量的網(wǎng)格塊
GridView.count({Key key, Axis scrollDirection: Axis.vertical, bool reverse: false, ScrollController controller, bool primary, ScrollPhysics physics, bool shrinkWrap: false, EdgeInsetsGeometry padding, @required int crossAxisCount, double mainAxisSpacing: 0.0, double crossAxisSpacing: 0.0, double childAspectRatio: 1.0, bool addAutomaticKeepAlives: true, bool addRepaintBoundaries: true, bool addSemanticIndexes: true, double cacheExtent, List<Widget> children: const <widget>[]</widget>, int semanticChildCount })
使用自定義SliverGridDelegate和自定義SliverChildDelegate創(chuàng)建可滾動的2D小部件數(shù)組
GridView.custom({Key key, Axis scrollDirection: Axis.vertical, bool reverse: false, ScrollController controller, bool primary, ScrollPhysics physics, bool shrinkWrap: false, EdgeInsetsGeometry padding, @required SliverGridDelegate gridDelegate, @required SliverChildDelegate childrenDelegate, double cacheExtent, int semanticChildCount })
使用每個都具有最大橫軸范圍的 網(wǎng)格塊 創(chuàng)建可滾動的2D小部件數(shù)組。
GridView.extent({Key key, Axis scrollDirection: Axis.vertical, bool reverse: false, ScrollController controller, bool primary, ScrollPhysics physics, bool shrinkWrap: false, EdgeInsetsGeometry padding, @required double maxCrossAxisExtent, double mainAxisSpacing: 0.0, double crossAxisSpacing: 0.0, double childAspectRatio: 1.0, bool addAutomaticKeepAlives: true, bool addRepaintBoundaries: true, bool addSemanticIndexes: true, List<Widget> children: const <widget>[]</widget>, int semanticChildCount })
屬性
名稱 類型 | 描述 |
---|---|
childrenDelegate → SliverChildDelegate | 為GridView提供子代的委托 |
gridDelegate → SliverGridDelegate | 一個控制 GridView 中子項布局的委托淳蔼。 |
cacheExtent → double | 視口在可見區(qū)域之前和之后有一個區(qū)域侧蘸,用于緩存在用戶滾動時即將變?yōu)榭梢姷捻椖?/td> |
controller → ScrollController | 一個對象,可用于控制滾動滾動視圖的位置 |
hashCode → int | 此對象的哈希碼 |
key → Key | 控制一個小部件如何替換樹中的另一個小部件 |
padding → EdgeInsetsGeometry | 插入子代的內(nèi)邊距 |
physics → ScrollPhysics | 滾動視圖應(yīng)如何響應(yīng)用戶輸入鹉梨,物理滾動方式 |
primary → bool | 這是否是與父 PrimaryScrollController 關(guān)聯(lián)的主滾動視圖讳癌。 |
reverse → bool | 滾動視圖是否在讀取方向上滾動 |
runtimeType → Type | 表示對象的運行時類型 |
scrollDirection → Axis | 滾動視圖的滾動軸 |
semanticChildCount → int | 將提供語義信息的子代數(shù)量 |
shrinkWrap → bool | 是否應(yīng)該由正在查看的內(nèi)容確定scrollDirection中滾動視圖的范圍。 |
方法
名稱 類型 | 描述 |
---|---|
buildChildLayout(BuildContext context) → Widget | 子類應(yīng)重寫此方法以構(gòu)建布局模型 |
build(BuildContext context) → Widget | 描述此窗口小部件表示的用戶界面部分 |
buildSlivers(BuildContext context) → List<Widget> | 構(gòu)建要放置在視口內(nèi)的窗口小部件列表 |
buildViewport(BuildContext context, ViewportOffset offset, AxisDirection axisDirection, List<Widget> slivers) → Widget | 構(gòu)建視口 |
createElement() → StatelessElement | 創(chuàng)建StatelessElement以管理此窗口小部件在樹中的位置存皂。 |
debugDescribeChildren() → List<DiagnosticsNode> | 返回描述此節(jié)點的子節(jié)點的DiagnosticsNode對象列表晌坤。 |
debugFillProperties(DiagnosticPropertiesBuilder properties) → void | 添加與節(jié)點關(guān)聯(lián)的其他屬性 |
getDirection(BuildContext context) → AxisDirection | 返回滾動視圖滾動的AxisDirection |
noSuchMethod(Invocation invocation) → dynamic | 訪問不存在的方法或?qū)傩詴r調(diào)用 |
toDiagnosticsNode({String name, DiagnosticsTreeStyle style }) → DiagnosticsNode | 返回調(diào)試工具和toStringDeep使用的對象的調(diào)試表示形式 |
toString({DiagnosticLevel minLevel: DiagnosticLevel.debug }) → String | 返回此對象的字符串表示形式 |
toStringDeep({String prefixLineOne: '', String prefixOtherLines, DiagnosticLevel minLevel: DiagnosticLevel.debug }) → String | 返回此節(jié)點及其后代的字符串表示形式。 |
toStringShallow({String joiner: ', ', DiagnosticLevel minLevel: DiagnosticLevel.debug }) → String | 返回對象的單行詳細描述 |
toStringShort() → String | 這個小部件的簡短文字描述 |