一. Slivers

我们考虑一个这样的布局:一个滑动的视图中包括一个标题视图(HeaderView),一个列表视图(ListView),一个网格视图(GridView)。

我们怎么可以让它们做到统一的滑动效果呢?使用前面的滚动是很难做到的。

Flutter中有一个可以完成这样滚动效果的Widget:CustomScrollView,可以统一管理多个滚动视图。

在CustomScrollView中,每一个独立的,可滚动的Widget被称之为Sliver。

补充:Sliver可以翻译成裂片、薄片,你可以将每一个独立的滚动视图当做一个小裂片。

1.1. Slivers的基本使用

因为我们需要把很多的Sliver放在一个CustomScrollView中,所以CustomScrollView有一个slivers属性,里面让我们放对应的一些Sliver:

SliverList:类似于我们之前使用过的ListView;
SliverFixedExtentList:类似于SliverList,只是可以设置滚动的高度;
SliverGrid:类似于我们之前使用过的GridView;
SliverPadding:设置Sliver的内边距,因为可能要单独给Sliver设置内边距;
SliverAppBar:添加一个AppBar,通常用来作为CustomScrollView的HeaderView;
SliverSafeArea:设置内容显示在安全区域(比如不让齐刘海挡住我们的内容)
我们简单演示一下:SliverGrid+SliverPadding+
SliverSafeArea的组合
class HomeContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CustomScrollView(
slivers: <Widget>[
SliverSafeArea(
sliver: SliverPadding(
padding: EdgeInsets.all(8),
sliver: SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 8,
mainAxisSpacing: 8,
),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment(0, 0),
color: Colors.orange,
child: Text("item$index"),
);
},
childCount: 20
),
),
),
)
],
);
}
}

1.2. Slivers的组合使用

这里我使用官方的示例程序,将SliverAppBar+SliverGrid+SliverFixedExtentList做出如下界面:

class HomeContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
return showCustomScrollView();
} Widget showCustomScrollView() {
return new CustomScrollView(
slivers: <Widget>[
const SliverAppBar(
expandedHeight: 250.0,
flexibleSpace: FlexibleSpaceBar(
title: Text('Coderwhy Demo'),
background: Image(
image: NetworkImage(
"https://tva1.sinaimg.cn/large/006y8mN6gy1g72j6nk1d4j30u00k0n0j.jpg",
),
fit: BoxFit.cover,
),
),
),
new SliverGrid(
gridDelegate: new SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 200.0,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 4.0,
),
delegate: new SliverChildBuilderDelegate(
(BuildContext context, int index) {
return new Container(
alignment: Alignment.center,
color: Colors.teal[100 * (index % 9)],
child: new Text('grid item $index'),
);
},
childCount: 10,
),
),
SliverFixedExtentList(
itemExtent: 50.0,
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return new Container(
alignment: Alignment.center,
color: Colors.lightBlue[100 * (index % 9)],
child: new Text('list item $index'),
);
},
childCount: 20
),
),
],
);
}
}

原文地址:https://www.jianshu.com/p/310cfd23ba3a

最新文章

  1. 使用jigdo下载debian [windows环境下]
  2. django入门记录 2
  3. JAVA导出pdf实例
  4. 一个快速查看API的汇编和机器码的工具.发布源码
  5. Oracle HRMS API &ndash; Create Employee
  6. Drupal 7.23:函数drupal_alter()注释
  7. css禁止双击dom节点被选中user-select:none
  8. Asp.Net Mvc5 之Controller
  9. 对数组元素进行排序的方法总结(利用C++)
  10. C# 中文在URL中的编码
  11. Entity Framework入门教程:SQLite数据源访问
  12. POJ 2653 Pick-up sticks [线段相交 迷之暴力]
  13. ant 脚本使用技巧
  14. Docker Compose 简介
  15. golang dlv 远程调试
  16. etcd集群的搭建
  17. 微信公众号Java接入demo
  18. 清空数据库错误:因为该表正由 FOREIGN KEY 约束引用 解决办法
  19. centos7下Redis-Sentinel安装和配置
  20. [算法]用java实现0-1背包和部分背包问题

热门文章

  1. 洛谷p2669
  2. 【读书笔记】JS函数式编程指南
  3. CesiumJS PrimitiveAPI 高级着色入门 - 从参数化几何与 Fabric 材质到着色器 - 上篇
  4. LinkedHashmap简要说明
  5. 宇宙最强开发工具VScode简易手册
  6. EPICS Archiver Appliance在Debian11下安装文档
  7. 交叉熵损失CrossEntropyLoss
  8. Linux操作命令(八)1.sort命令 2.uniq命令 3.join命令
  9. react的useRef
  10. 记录篇-浪潮服务器raid卡