网易首页 > 网易号 > 正文 申请入驻

flutter系列之:使用SliverList和SliverGird

0
分享至

简介

在上一篇文章我们讲解SliverAppBar的时候有提到过,Sliver的组件一般都用在CustomScrollView中。除了SliverAppBar之外,我们还可以为CustomScrollView添加List或者Grid来实现更加复杂的组合效果。

今天要向大家介绍的就是SliverList和SliverGird。

SliverList和SliverGird详解

从名字就可以看出SliverList和SliverGird分别是List和Grid的一种,他们和List与Grid最大的区别在于,他们可以控制子widget在main axis和cross axis之间的间隔,并且可以通过Extent属性来控制子widget的大小,非常的强大。

我们先来看下这两个组件的定义和构造函数:

class SliverList extends SliverMultiBoxAdaptorWidget {
/// Creates a sliver that places box children in a linear array.
const SliverList({
Key? key,
required SliverChildDelegate delegate,
}) : super(key: key, delegate: delegate);

SliverList继承自SliverMultiBoxAdaptorWidget,它的构造函数比较简单,需要传入一个SliverChildDelegate的参数,这里的SliverChildDelegate使用的是delegate的方法来创建SliverList的子组件。

SliverChildDelegate是一个抽象类,它有两个实现类,分别是SliverChildBuilderDelegate和SliverChildListDelegate。

其中SliverChildBuilderDelegate是用的builder模式来生成子widget,在上一篇文章中,我们构建SliverList就是使用的这个builder类。

SliverChildBuilderDelegate使用builder来生成子Widget,而SliverChildListDelegate需要传入一个childList来完成构造,也就是说SliverChildListDelegate需要一个确切的childList,而不是用builder来构建。

要注意的是SliverList并不能指定子widget的extent大小,如果你想指定List中的子widget的extent大小的话,那么可以使用SliverFixedExtentList:

class SliverFixedExtentList extends SliverMultiBoxAdaptorWidget {
const SliverFixedExtentList({
Key? key,
required SliverChildDelegate delegate,
required this.itemExtent,
}) : super(key: key, delegate: delegate);

可以看到SliverFixedExtentList和SliverList相比,多了一个itemExtent参数,用来控制子widget在main axis上的大小。

然后我们再来看一下SliverGird:

class SliverGrid extends SliverMultiBoxAdaptorWidget {
/// Creates a sliver that places multiple box children in a two dimensional
/// arrangement.
const SliverGrid({
Key? key,
required SliverChildDelegate delegate,
required this.gridDelegate,
}) : super(key: key, delegate: delegate);

SliverGrid也是继承自SliverMultiBoxAdaptorWidget,和SliverList一样,它也有一个SliverChildDelegate的参数,另外它还多了一个gridDelegate的参数用来控制gird的布局。

这里的gridDelegate是一个SliverGridDelegate类型的参数,用来控制children的size和position。

SliverGridDelegate也是一个抽象类,它有两个实现类,分别是SliverGridDelegateWithMaxCrossAxisExtent和SliverGridDelegateWithFixedCrossAxisCount,这两个实现类的区别就在于MaxCrossAxisExtent和FixedCrossAxisCount的区别。

怎么理解MaxCrossAxisExtent呢?比如说这个Grid是竖向的,然后Gird的宽度是500.0,如果MaxCrossAxisExtent=100,那么delegate将会创建5个column,每个column的宽度是100。

crossAxisCount则是直接指定cross axis的child个数有多少。

SliverList和SliverGird的使用

有了上面介绍的SliverList和SliverGird的构造函数,接下来我们具体来看下如何在项目中使用SliverList和SliverGird。

默认情况下SliverList和SliverGird是需要和CustomScrollView一起使用的,所以我们先创建一个CustomScrollView,在它的slivers属性中,放入一个SliverAppBar组件:

CustomScrollView(
slivers: [
const SliverAppBar(
pinned: true,
snap: false,
floating: false,
expandedHeight: 200.0,
flexibleSpace: FlexibleSpaceBar(
title: Text('SliverList and SliverGrid'),
),
),
],

SliverAppBar只是一个AppBar,运行可以得到下面的界面:

我们还需要为它继续添加其他的slivers组件。

首先给他添加一个SliverGrid:

SliverGrid(
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 200.0,
mainAxisSpacing: 20.0,
crossAxisSpacing: 50.0,
childAspectRatio: 4.0,
),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.green[100 * (index % 9)],
child: Text('grid item $index'),
},
childCount: 20,
),
),

这里我们设置了gridDelegate属性,并且自定义了SliverChildBuilderDelegate,用来生成20个Container。

运行得到的界面如下:

然后为其添加SliverList:

SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
color: index.isOdd ? Colors.white : Colors.green,
height: 50.0,
child: Center(
child: ListTile(
title: Text(
'100' + index.toString(),
style: const TextStyle(fontWeight: FontWeight.w500),
),
leading: Icon(
Icons.account_box,
color: Colors.green[100 * (index % 9)],
),
),
),
},
childCount: 15,
),
),

因为SliverList只需要传入一个delegate参数,这里我们生成了15个child组件。生成的界面如下:

因为SliverList不能控制List中子widget的extent,所以我们再添加一个SliverFixedExtentList看看效果:

SliverFixedExtentList(
itemExtent: 100.0,
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
color: index.isOdd ? Colors.white : Colors.green,
height: 50.0,
child: Center(
child: ListTile(
title: Text(
'200' + index.toString(),
style: const TextStyle(fontWeight: FontWeight.w500),
),
leading: Icon(
Icons.account_box,
color: Colors.green[100 * (index % 9)],
),
),
),
},
childCount: 15,
),

SliverFixedExtentList和SliverList相比多了一个itemExtent属性,这里我们将其设置为100,运行可以得到下面的界面:

可以看到List中的子Widget高度发生了变化。

总结

在CustomScrollView中使用SliverList和SliverGird,可以实现灵活的呈现效果。

本文的例子:https://github.com/ddean2009/learn-flutter.git

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
45岁富哥“北京肖哥”去世,前一天还晒老婆,死因曝光仇人都惋惜

45岁富哥“北京肖哥”去世,前一天还晒老婆,死因曝光仇人都惋惜

嫹笔牂牂
2025-12-31 07:07:52
中国移动反击战打响!10年老号不再受冷落,四大福利直接安排

中国移动反击战打响!10年老号不再受冷落,四大福利直接安排

复转这些年
2026-02-08 23:46:24
美欲拉中国“入伙”:台湾已不是问题,严防误判!

美欲拉中国“入伙”:台湾已不是问题,严防误判!

人类的关注
2026-02-08 22:31:51
直击冬奥|中国队获首枚奖牌,花滑无缘决赛,首金大概率会是谁?

直击冬奥|中国队获首枚奖牌,花滑无缘决赛,首金大概率会是谁?

罗掌柜体育
2026-02-08 10:05:31
评论员:C罗要认清自己,要是没沙特引路他500年也进不去白宫

评论员:C罗要认清自己,要是没沙特引路他500年也进不去白宫

懂球帝
2026-02-08 09:48:08
孙颖莎4-3战胜王曼昱夺得冠军,赛后言论展现高情商

孙颖莎4-3战胜王曼昱夺得冠军,赛后言论展现高情商

老曁科普
2026-02-09 00:29:28
蒯曼把张本美和打哭,也被打服了:东西都拿出来,蒯曼太厉害了!

蒯曼把张本美和打哭,也被打服了:东西都拿出来,蒯曼太厉害了!

篮球资讯达人
2026-02-09 02:41:34
神级首秀!87+14+13!东部最强三巨头诞生

神级首秀!87+14+13!东部最强三巨头诞生

篮球实战宝典
2026-02-08 15:47:52
匈牙利总理:乌克兰是我们的敌人

匈牙利总理:乌克兰是我们的敌人

扬子晚报
2026-02-08 16:18:53
CBA传来一大悲剧!男篮顶薪哥赛季报销:5年遭遇4次大伤太惨了

CBA传来一大悲剧!男篮顶薪哥赛季报销:5年遭遇4次大伤太惨了

篮球快餐车
2026-02-08 00:44:23
张雪峰:本科已严重饱和的五个专业,1、临床医学,2、法学,3、计算机…考研是唯一出路!

张雪峰:本科已严重饱和的五个专业,1、临床医学,2、法学,3、计算机…考研是唯一出路!

李东阳朋友圈
2025-08-22 09:31:34
多地“214”结婚登记一号难求,6省份去年结婚登记数据公布

多地“214”结婚登记一号难求,6省份去年结婚登记数据公布

第一财经资讯
2026-02-07 16:17:12
高市早苗大概率已经获胜

高市早苗大概率已经获胜

民工看市
2026-02-08 21:38:21
扁鹊临终前留下妙方:若想脾胃好,少碰三样东西,多食三物

扁鹊临终前留下妙方:若想脾胃好,少碰三样东西,多食三物

千秋文化
2026-02-04 21:08:51
辽宁女子存1000万剩1元,银行拒不承认,警方一句话女子懵了

辽宁女子存1000万剩1元,银行拒不承认,警方一句话女子懵了

朝子亥
2026-02-08 18:00:03
民政局离婚人数暴涨!核心原因只有一个:婚姻不再将就

民政局离婚人数暴涨!核心原因只有一个:婚姻不再将就

好贤观史记
2025-12-29 23:45:05
中国豪夺9金4银2铜,力压日韩,米兰冬奥再争亚洲第一

中国豪夺9金4银2铜,力压日韩,米兰冬奥再争亚洲第一

新时代精神
2026-02-07 20:20:56
王楚钦4-2逆转张本,亚洲杯成功卫冕关键球解气

王楚钦4-2逆转张本,亚洲杯成功卫冕关键球解气

老贃是个手艺人
2026-02-09 00:25:46
上官婉儿一生有多少男人?2013年其墓葬被发现,揭开历史真相!

上官婉儿一生有多少男人?2013年其墓葬被发现,揭开历史真相!

谈史论天地
2026-02-08 14:00:09
冬奥羽绒服哪家强?中国穿李宁、美国拉夫劳伦、加拿大Lululemon

冬奥羽绒服哪家强?中国穿李宁、美国拉夫劳伦、加拿大Lululemon

商务范
2026-02-07 15:47:10
2026-02-09 05:32:49
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

为实现雄心勃勃的计划,特斯拉开始招人

头条要闻

日本选举结果 可能让国家进入相当危险阶段

头条要闻

日本选举结果 可能让国家进入相当危险阶段

体育要闻

“我就是王楚钦” 王楚钦霸气指向球衣背后

娱乐要闻

金晨被罚1500后首露面,表情沉重心事重重

财经要闻

宽基ETF开年大赎回,什么信号?

汽车要闻

VLA司机大模型优化 理想汽车OTA8.3版本更新

态度原创

亲子
房产
本地
教育
公开课

亲子要闻

人类婴儿为什么这么能哭?在原始社会难道不怕引来野兽吗?

房产要闻

实景超预期呈现!三亚豪宅,再迎封面之作!

本地新闻

围观了北京第一届黑色羽绒服大赛,我笑疯了

教育要闻

今天,南京不少牛娃参加了这场考试!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版