Flutter GridView 控件

一個(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ù)與gridDelegateSliverGridDelegateWithFixedCrossAxisCountSliverGridDelegateWithMaxCrossAxisExtent 一起使用。

要使用自定義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(例如 SliverListSliverAppBar)放入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...'),
        ],
      ),
    ),
  ],
)

也可以看看:

構(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 })

屬性

名稱 類型 描述
childrenDelegateSliverChildDelegate 為GridView提供子代的委托
gridDelegateSliverGridDelegate 一個(gè)控制 GridView 中子項(xiàng)布局的委托。
cacheExtentdouble 視口在可見區(qū)域之前和之后有一個(gè)區(qū)域,用于緩存在用戶滾動(dòng)時(shí)即將變?yōu)榭梢姷捻?xiàng)目
controllerScrollController 一個(gè)對(duì)象,可用于控制滾動(dòng)滾動(dòng)視圖的位置
hashCodeint 此對(duì)象的哈希碼
keyKey 控制一個(gè)小部件如何替換樹中的另一個(gè)小部件
paddingEdgeInsetsGeometry 插入子代的內(nèi)邊距
physicsScrollPhysics 滾動(dòng)視圖應(yīng)如何響應(yīng)用戶輸入,物理滾動(dòng)方式
primarybool 這是否是與父 PrimaryScrollController 關(guān)聯(lián)的主滾動(dòng)視圖。
reversebool 滾動(dòng)視圖是否在讀取方向上滾動(dòng)
runtimeTypeType 表示對(duì)象的運(yùn)行時(shí)類型
scrollDirectionAxis 滾動(dòng)視圖的滾動(dòng)軸
semanticChildCountint 將提供語(yǔ)義信息的子代數(shù)量
shrinkWrapbool 是否應(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)短文字描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容