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

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.

相关推荐
热点推荐
80一晚网吧包间,被这群人"玩"出花样,撕开当下社会最体面的一幕

80一晚网吧包间,被这群人"玩"出花样,撕开当下社会最体面的一幕

毒sir财经
2026-02-07 23:20:33
范冰冰男友详细资料被扒,离过婚还有一个儿子,对范冰冰爱慕已久

范冰冰男友详细资料被扒,离过婚还有一个儿子,对范冰冰爱慕已久

八卦王者
2026-02-08 16:13:41
两野猫把景观池当“自助餐厅”走红,江苏园博园:不干涉,抓得到是本事

两野猫把景观池当“自助餐厅”走红,江苏园博园:不干涉,抓得到是本事

上游新闻
2026-02-06 12:05:11
贝克汉姆14岁女儿小七首次在家庭风波中发声,大布只和小妹妹联系

贝克汉姆14岁女儿小七首次在家庭风波中发声,大布只和小妹妹联系

笑傲春秋
2026-02-06 14:11:11
假房假妻假儿女,他布局4年骗走香港明星4亿巨款,至今下落不明

假房假妻假儿女,他布局4年骗走香港明星4亿巨款,至今下落不明

不似少年游
2026-02-07 09:33:17
S妈反悔了!想夺回孙子抚养权准备打官司,小玥儿越来越高冷!

S妈反悔了!想夺回孙子抚养权准备打官司,小玥儿越来越高冷!

古希腊掌管月桂的神
2026-02-06 11:29:24
乌拉圭足协主席:我们有信心,中国2030年一定要进世界杯

乌拉圭足协主席:我们有信心,中国2030年一定要进世界杯

懂球帝
2026-02-07 22:25:10
网红刘鑫宇去世,留5年长发比女生还美,有两个儿子,妻子曝死因

网红刘鑫宇去世,留5年长发比女生还美,有两个儿子,妻子曝死因

古希腊掌管松饼的神
2026-02-07 16:30:14
岛国成人VA内幕,那些被逼着拍片儿的女孩

岛国成人VA内幕,那些被逼着拍片儿的女孩

年代回忆
2026-02-02 20:24:54
安徽一教育集团总校长被查

安徽一教育集团总校长被查

阜阳发布
2026-02-08 17:52:49
小玥儿最新露面照扎心!穿黑衣悼念大S神情哀伤,11岁的她什么都懂

小玥儿最新露面照扎心!穿黑衣悼念大S神情哀伤,11岁的她什么都懂

八卦王者
2026-02-06 15:58:36
愿平安,林赛-沃恩在米兰冬奥会中严重摔伤,被直升机拉走

愿平安,林赛-沃恩在米兰冬奥会中严重摔伤,被直升机拉走

懂球帝
2026-02-08 19:59:31
网飞特离谱的黄暴美剧,偏偏还很火,真是独一份了

网飞特离谱的黄暴美剧,偏偏还很火,真是独一份了

来看美剧
2026-02-01 19:51:56
网约车拉鳄鱼?司机:就两条鱼而已,没事的

网约车拉鳄鱼?司机:就两条鱼而已,没事的

用车指南
2026-02-08 10:02:05
85年我去相亲,丈母娘让我和大姐睡一屋,那晚我目睹了难忘一幕

85年我去相亲,丈母娘让我和大姐睡一屋,那晚我目睹了难忘一幕

奶茶麦子
2026-02-07 17:06:25
豪赌!四家巨头狂砸4.6万亿押注AI!“没有一家愿意输!”黄仁勋力挺:AI需求火爆,庞大支出合理、可持续

豪赌!四家巨头狂砸4.6万亿押注AI!“没有一家愿意输!”黄仁勋力挺:AI需求火爆,庞大支出合理、可持续

雪球
2026-02-08 13:03:15
12306回应儿童票与成人票不连座:同一账号同时购票优先分配连座,若没连座可尝试寻求帮助协调换座

12306回应儿童票与成人票不连座:同一账号同时购票优先分配连座,若没连座可尝试寻求帮助协调换座

南国今报
2026-02-08 16:43:06
2026春节养老金提前发!人社局最新通知,钱袋子这就稳了!

2026春节养老金提前发!人社局最新通知,钱袋子这就稳了!

至死不渝的爱情
2026-02-08 11:42:20
历代皇室为何把王莽的头颅当宝贝,前后收藏了272年,它有何特别

历代皇室为何把王莽的头颅当宝贝,前后收藏了272年,它有何特别

千秋文化
2026-01-30 21:47:10
6家!福州今年开业计划曝光,福州多家商场被吐槽“鬼城”

6家!福州今年开业计划曝光,福州多家商场被吐槽“鬼城”

童童聊娱乐啊
2026-02-08 06:15:37
2026-02-09 01:39:00
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

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

头条要闻

高市早苗豪赌得手保住相位 实现“双重巩固”

头条要闻

高市早苗豪赌得手保住相位 实现“双重巩固”

体育要闻

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

娱乐要闻

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

财经要闻

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

汽车要闻

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

态度原创

手机
游戏
数码
本地
教育

手机要闻

古尔曼:苹果iOS 26.4首个测试版最快2月23日当周发布

WRL年度总决赛:JT绝境翻盘夺得冠军!EW横扫SYG成就大满贯

数码要闻

平民本地AI神器!苹果M4 Mac mini面临缺货

本地新闻

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

教育要闻

西交大少年班初试结果出炉!玄外又是第一!

无障碍浏览 进入关怀版