一个可滚动的2D排列的小部件。
控件网格的主轴方向是它滚动的方向( scrollDirection)。
最常用的网格布局是 GridView.count,它创建了一个在横轴上具有固定数量 网格块 的平铺的布局,和 GridView.extent ,它使用具有最大横轴范围的 网格块 创建布局。自定义 SliverGridDelegate 可以生成任意2D排列的子代,包括未对齐或重叠的排列。
要创建具有大量(或无限)个子节点的网格,请将 GridView.builder 构造函数与gridDelegate 的 SliverGridDelegateWithFixedCrossAxisCount 或 SliverGridDelegateWithMaxCrossAxisExtent 一起使用。
要使用自定义SliverChildDelegate ,请使用 GridView.custom。
要创建线性数组的子代,请使用 ListView。
若要控制滚动视图的初始滚动偏移,请为控制器 controller 提供其ScrollController.initialScrollOffset 属性集。
转换到CustomScrollView
GridView基本上是一个 CustomScrollView ,其 CustomScrollView.slivers 中包含一个SliverGrid。
如果GridView不再足够,例如因为滚动视图既有网格又有列表,或者因为网格要与 SliverAppBar 等组合在一起,直接将代码从使用 GridView 移植到 CustomScrollView 直接使用。
CustomScrollView.slivers 属性只能使用包含 SliverGrid 的列表。
GridView上 的 childrenDelegate 属性对应于 SliverGrid.delegate 属性,GridView上 的 gridDelegate 属性对应于 SliverGrid.gridDelegate 属性。
GridView,GridView.count和GridView.extent构造函数的子参数对应于 GridView 中 childrenDelegate 是具有相同参数的 SliverChildListDelegate。
GridView.builder 构造函数的 itemBuilder 和 childCount 参数对应于 GridView 中的 childrenDelegate,它们是具有匹配参数的 SliverChildBuilderDelegate
GridView.count 和 GridView.extent 构造函数创建自定义网格委托,并在 SliverGrid上 具有等效命名的构造函数以简化转换:分别为 SliverGrid.count 和 SliverGrid.extent。
padding 属性对应于在 CustomScrollView.slivers 属性中使用 SliverPadding 而不是网格本身,并且让 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: [
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: [
SliverPadding(
padding: const EdgeInsets.all(20.0),
sliver: SliverGrid.count(
crossAxisSpacing: 10.0,
crossAxisCount: 2,
children: [
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用创建自定义滚动效果。
- SliverGridDelegateWithFixedCrossAxisCount,它创建一个在横轴上具有固定数量的 网格块 的布局。
- SliverGridDelegateWithMaxCrossAxisExtent,用于创建具有最大横轴范围的 网格块 的布局。
- ScrollNotification 和 NotificationListener,可用于在不使用 ScrollController 的情况下查看滚动位置。
构造函数
使用自定义SliverGridDelegate创建可滚动的2D小部件数组
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
创建 按需创建的可滚动的2D小部件数组
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 })
创建一个可滚动的2D小部件数组,在横轴上具有固定数量的网格块
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
使用自定义SliverGridDelegate和自定义SliverChildDelegate创建可滚动的2D小部件数组
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 })
使用每个都具有最大横轴范围的 网格块 创建可滚动的2D小部件数组。
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
属性
名称 类型 | 描述 |
---|---|
childrenDelegate → SliverChildDelegate | 为GridView提供子代的委托 |
gridDelegate → SliverGridDelegate | 一个控制 GridView 中子项布局的委托。 |
cacheExtent → double | 视口在可见区域之前和之后有一个区域,用于缓存在用户滚动时即将变为可见的项目 |
controller → ScrollController | 一个对象,可用于控制滚动滚动视图的位置 |
hashCode → int | 此对象的哈希码 |
key → Key | 控制一个小部件如何替换树中的另一个小部件 |
padding → EdgeInsetsGeometry | 插入子代的内边距 |
physics → ScrollPhysics | 滚动视图应如何响应用户输入,物理滚动方式 |
primary → bool | 这是否是与父 PrimaryScrollController 关联的主滚动视图。 |
reverse → bool | 滚动视图是否在读取方向上滚动 |
runtimeType → Type | 表示对象的运行时类型 |
scrollDirection → Axis | 滚动视图的滚动轴 |
semanticChildCount → int | 将提供语义信息的子代数量 |
shrinkWrap → bool | 是否应该由正在查看的内容确定scrollDirection中滚动视图的范围。 |
方法
名称 类型 | 描述 |
---|---|
buildChildLayout(BuildContext context) → Widget | 子类应重写此方法以构建布局模型 |
build(BuildContext context) → Widget | 描述此窗口小部件表示的用户界面部分 |
buildSlivers(BuildContext context) → List |
构建要放置在视口内的窗口小部件列表 |
buildViewport(BuildContext context, ViewportOffset offset, AxisDirection axisDirection, List |
构建视口 |
createElement() → StatelessElement | 创建StatelessElement以管理此窗口小部件在树中的位置。 |
debugDescribeChildren() → List |
返回描述此节点的子节点的DiagnosticsNode对象列表。 |
debugFillProperties(DiagnosticPropertiesBuilder properties) → void | 添加与节点关联的其他属性 |
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 | 返回此节点及其后代的字符串表示形式。 |
toStringShallow({String joiner: ', ', DiagnosticLevel minLevel: DiagnosticLevel.debug }) → String | 返回对象的单行详细描述 |
toStringShort() → String | 这个小部件的简短文字描述 |