一個(gè)可滾動(dòng)的2D排列的小部件。
控件網(wǎng)格的主軸方向是它滾動(dòng)的方向( scrollDirection)。
最常用的網(wǎng)格布局是 GridView.count,它創(chuàng)建了一個(gè)在橫軸上具有固定數(shù)量 網(wǎng)格塊 的平鋪的布局,和 GridView.extent ,它使用具有最大橫軸范圍的 網(wǎng)格塊 創(chuàng)建布局。自定義 SliverGridDelegate 可以生成任意2D排列的子代,包括未對(duì)齊或重疊的排列。
要?jiǎng)?chuàng)建具有大量(或無(wú)限)個(gè)子節(jié)點(diǎn)的網(wǎng)格,請(qǐng)將 GridView.builder 構(gòu)造函數(shù)與gridDelegate 的 SliverGridDelegateWithFixedCrossAxisCount 或 SliverGridDelegateWithMaxCrossAxisExtent 一起使用。
要使用自定義SliverChildDelegate ,請(qǐng)使用 GridView.custom。
要?jiǎng)?chuàng)建線性數(shù)組的子代,請(qǐng)使用 ListView。
若要控制滾動(dòng)視圖的初始滾動(dòng)偏移,請(qǐng)為控制器 controller 提供其ScrollController.initialScrollOffset 屬性集。
轉(zhuǎn)換到CustomScrollView
GridView基本上是一個(gè) CustomScrollView ,其 CustomScrollView.slivers 中包含一個(gè)SliverGrid。
如果GridView不再足夠,例如因?yàn)闈L動(dòng)視圖既有網(wǎng)格又有列表,或者因?yàn)榫W(wǎng)格要與 SliverAppBar 等組合在一起,直接將代碼從使用 GridView 移植到 CustomScrollView 直接使用。
CustomScrollView.slivers 屬性只能使用包含 SliverGrid 的列表。
GridView上 的 childrenDelegate 屬性對(duì)應(yīng)于 SliverGrid.delegate 屬性,GridView上 的 gridDelegate 屬性對(duì)應(yīng)于 SliverGrid.gridDelegate 屬性。
GridView,GridView.count和GridView.extent構(gòu)造函數(shù)的子參數(shù)對(duì)應(yīng)于 GridView 中 childrenDelegate 是具有相同參數(shù)的 SliverChildListDelegate。
GridView.builder 構(gòu)造函數(shù)的 itemBuilder 和 childCount 參數(shù)對(duì)應(yīng)于 GridView 中的 childrenDelegate,它們是具有匹配參數(shù)的 SliverChildBuilderDelegate
GridView.count 和 GridView.extent 構(gòu)造函數(shù)創(chuàng)建自定義網(wǎng)格委托,并在 SliverGrid上 具有等效命名的構(gòu)造函數(shù)以簡(jiǎn)化轉(zhuǎn)換:分別為 SliverGrid.count 和 SliverGrid.extent。
padding 屬性對(duì)應(yīng)于在 CustomScrollView.slivers 屬性中使用 SliverPadding 而不是網(wǎng)格本身,并且讓 SliverGrid 成為 SliverPadding 的子級(jí)。
默認(rèn)情況下,ListView將自動(dòng)填充列表的可滾動(dòng)范圍,以避免MediaQuery的padding 造成的部分障礙。要避免此行為,請(qǐng)使用padding屬性為0進(jìn)行覆蓋。
將代碼移植到使用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,它是一個(gè)具有單個(gè)子項(xiàng)的可滾動(dòng)窗口小部件。
- ListView,它是可滾動(dòng)的,線性的小部件列表。
- PageView,這是一個(gè)滾動(dòng)列表,頁(yè)面視圖的每個(gè)子項(xiàng)大小都被強(qiáng)制與視口大小相同。
- CustomScrollView,這是一個(gè)可滾動(dòng)的小部件,使Slivers用創(chuàng)建自定義滾動(dòng)效果。
- SliverGridDelegateWithFixedCrossAxisCount,它創(chuàng)建一個(gè)在橫軸上具有固定數(shù)量的 網(wǎng)格塊 的布局。
- SliverGridDelegateWithMaxCrossAxisExtent,用于創(chuàng)建具有最大橫軸范圍的 網(wǎng)格塊 的布局。
- ScrollNotification 和 NotificationListener,可用于在不使用 ScrollController 的情況下查看滾動(dòng)位置。
構(gòu)造函數(shù)
使用自定義SliverGridDelegate創(chuàng)建可滾動(dò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)建的可滾動(dò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)建一個(gè)可滾動(dò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)建可滾動(dò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 })
使用每個(gè)都具有最大橫軸范圍的 網(wǎng)格塊 創(chuàng)建可滾動(dò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 | 一個(gè)控制 GridView 中子項(xiàng)布局的委托。 |
| cacheExtent → double | 視口在可見區(qū)域之前和之后有一個(gè)區(qū)域,用于緩存在用戶滾動(dòng)時(shí)即將變?yōu)榭梢姷捻?xiàng)目 |
| controller → ScrollController | 一個(gè)對(duì)象,可用于控制滾動(dòng)滾動(dòng)視圖的位置 |
| hashCode → int | 此對(duì)象的哈希碼 |
| key → Key | 控制一個(gè)小部件如何替換樹中的另一個(gè)小部件 |
| padding → EdgeInsetsGeometry | 插入子代的內(nèi)邊距 |
| physics → ScrollPhysics | 滾動(dòng)視圖應(yīng)如何響應(yīng)用戶輸入,物理滾動(dòng)方式 |
| primary → bool | 這是否是與父 PrimaryScrollController 關(guān)聯(lián)的主滾動(dòng)視圖。 |
| reverse → bool | 滾動(dòng)視圖是否在讀取方向上滾動(dòng) |
| runtimeType → Type | 表示對(duì)象的運(yùn)行時(shí)類型 |
| scrollDirection → Axis | 滾動(dòng)視圖的滾動(dòng)軸 |
| semanticChildCount → int | 將提供語(yǔ)義信息的子代數(shù)量 |
| shrinkWrap → bool | 是否應(yīng)該由正在查看的內(nèi)容確定scrollDirection中滾動(dòng)視圖的范圍。 |
方法
| 名稱 類型 | 描述 |
|---|---|
| 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é)點(diǎn)的子節(jié)點(diǎn)的DiagnosticsNode對(duì)象列表。 |
| debugFillProperties(DiagnosticPropertiesBuilder properties) → void | 添加與節(jié)點(diǎn)關(guān)聯(lián)的其他屬性 |
| getDirection(BuildContext context) → AxisDirection | 返回滾動(dòng)視圖滾動(dòng)的AxisDirection |
| noSuchMethod(Invocation invocation) → dynamic | 訪問不存在的方法或?qū)傩詴r(shí)調(diào)用 |
| toDiagnosticsNode({String name, DiagnosticsTreeStyle style }) → DiagnosticsNode | 返回調(diào)試工具和toStringDeep使用的對(duì)象的調(diào)試表示形式 |
| toString({DiagnosticLevel minLevel: DiagnosticLevel.debug }) → String | 返回此對(duì)象的字符串表示形式 |
| toStringDeep({String prefixLineOne: '', String prefixOtherLines, DiagnosticLevel minLevel: DiagnosticLevel.debug }) → String | 返回此節(jié)點(diǎn)及其后代的字符串表示形式。 |
| toStringShallow({String joiner: ', ', DiagnosticLevel minLevel: DiagnosticLevel.debug }) → String | 返回對(duì)象的單行詳細(xì)描述 |
| toStringShort() → String | 這個(gè)小部件的簡(jiǎn)短文字描述 |