Flutter GridView 控件

一個可滾動的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 構造函數(shù)與gridDelegateSliverGridDelegateWithFixedCrossAxisCountSliverGridDelegateWithMaxCrossAxisExtent 一起使用。

要使用自定義SliverChildDelegate ,請使用 GridView.custom。

要創(chuàng)建線性數(shù)組的子代,請使用 ListView。

若要控制滾動視圖的初始滾動偏移,請為控制器 controller 提供其ScrollController.initialScrollOffset 屬性集。

轉換到CustomScrollView

GridView基本上是一個 CustomScrollView ,其 CustomScrollView.slivers 中包含一個SliverGrid。

如果GridView不再足夠,例如因為滾動視圖既有網(wǎng)格又有列表,或者因為網(wǎng)格要與 SliverAppBar 等組合在一起,直接將代碼從使用 GridView 移植到 CustomScrollView 直接使用。

CustomScrollView.slivers 屬性只能使用包含 SliverGrid 的列表。

GridView上 的 childrenDelegate 屬性對應于 SliverGrid.delegate 屬性,GridView上 的 gridDelegate 屬性對應于 SliverGrid.gridDelegate 屬性。

GridView,GridView.count和GridView.extent構造函數(shù)的子參數(shù)對應于 GridView 中 childrenDelegate 是具有相同參數(shù)的 SliverChildListDelegate。

GridView.builder 構造函數(shù)的 itemBuilder 和 childCount 參數(shù)對應于 GridView 中的 childrenDelegate,它們是具有匹配參數(shù)的 SliverChildBuilderDelegate

GridView.count 和 GridView.extent 構造函數(shù)創(chuàng)建自定義網(wǎng)格委托,并在 SliverGrid上 具有等效命名的構造函數(shù)以簡化轉換:分別為 SliverGrid.count 和 SliverGrid.extent。

padding 屬性對應于在 CustomScrollView.slivers 屬性中使用 SliverPadding 而不是網(wǎng)格本身,并且讓 SliverGrid 成為 SliverPadding 的子級。

默認情況下,ListView將自動填充列表的可滾動范圍,以避免MediaQuery的padding 造成的部分障礙。要避免此行為,請使用padding屬性為0進行覆蓋。

將代碼移植到使用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...'),
        ],
      ),
    ),
  ],
)

也可以看看:

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

屬性

名稱 類型 描述
childrenDelegateSliverChildDelegate 為GridView提供子代的委托
gridDelegateSliverGridDelegate 一個控制 GridView 中子項布局的委托。
cacheExtentdouble 視口在可見區(qū)域之前和之后有一個區(qū)域,用于緩存在用戶滾動時即將變?yōu)榭梢姷捻椖?/td>
controllerScrollController 一個對象,可用于控制滾動滾動視圖的位置
hashCodeint 此對象的哈希碼
keyKey 控制一個小部件如何替換樹中的另一個小部件
paddingEdgeInsetsGeometry 插入子代的內邊距
physicsScrollPhysics 滾動視圖應如何響應用戶輸入,物理滾動方式
primarybool 這是否是與父 PrimaryScrollController 關聯(lián)的主滾動視圖。
reversebool 滾動視圖是否在讀取方向上滾動
runtimeTypeType 表示對象的運行時類型
scrollDirectionAxis 滾動視圖的滾動軸
semanticChildCountint 將提供語義信息的子代數(shù)量
shrinkWrapbool 是否應該由正在查看的內容確定scrollDirection中滾動視圖的范圍。

方法

名稱 類型 描述
buildChildLayout(BuildContext context) → Widget 子類應重寫此方法以構建布局模型
build(BuildContext context) → Widget 描述此窗口小部件表示的用戶界面部分
buildSlivers(BuildContext context) → List<Widget> 構建要放置在視口內的窗口小部件列表
buildViewport(BuildContext context, ViewportOffset offset, AxisDirection axisDirection, List<Widget> slivers) → Widget 構建視口
createElement() → StatelessElement 創(chuàng)建StatelessElement以管理此窗口小部件在樹中的位置。
debugDescribeChildren() → List<DiagnosticsNode> 返回描述此節(jié)點的子節(jié)點的DiagnosticsNode對象列表。
debugFillProperties(DiagnosticPropertiesBuilder properties) → void 添加與節(jié)點關聯(lián)的其他屬性
getDirection(BuildContext context) → AxisDirection 返回滾動視圖滾動的AxisDirection
noSuchMethod(Invocation invocation) → dynamic 訪問不存在的方法或屬性時調用
toDiagnosticsNode({String name, DiagnosticsTreeStyle style }) → DiagnosticsNode 返回調試工具和toStringDeep使用的對象的調試表示形式
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 這個小部件的簡短文字描述
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容