CustomScrollView是使用Sliver组件创建自定义滚动效果的滚动组件。使用场景:

  1. ListView和GridView相互嵌套场景,ListView嵌套GridView时,需要给GridView指定高度,但我们希望高度随内容而变化(不指定),ListView和GridView使用同一个滚动效果。
  2. 一个页面顶部是AppBar,然后是GridView,最后是ListView,这3个区域以整体来滚动,AppBar具有吸顶效果。

CustomScrollView就像一个粘合剂,将多个组件粘合在一起,具统一的滚动效果。

Sliver系列组件有很多,比如SliverList、SliverGrid、SliverFixedExtentList、SliverPadding、SliverAppBar等。

#相互嵌套场景

在实际业务场景中经常见到这样的布局,顶部是网格布局(GridView),然后是列表布局(ListView),滚动的时候做为一个整体,此场景是无法使用GridView+ListView来实现的,而是需要使用CustomScrollView+SliverGrid+SliverList来实现,实现代码如下:

CustomScrollView(
slivers: <Widget>[
SliverGrid.count(crossAxisCount: 4,children: List.generate(8, (index){
return Container(
color: Colors.primaries[index%Colors.primaries.length],
alignment: Alignment.center,
child: Text('$index',style: TextStyle(color: Colors.white,fontSize: 20),),
);
}).toList(),),
SliverList(
delegate: SliverChildBuilderDelegate((content, index) {
return Container(
height: 85,
alignment: Alignment.center,
color: Colors.primaries[index % Colors.primaries.length],
child: Text('$index',style: TextStyle(color: Colors.white,fontSize: 20),),
);
}, childCount: 25),
)
],
)

效果如下:

顶部是AppBar场景

实际项目中页面顶部是AppBar,然后是GridView,最后是ListView,这3个区域以整体来滚动,AppBar具有吸顶效果,此效果也是我们经常遇到的,用法如下:

CustomScrollView(
slivers: <Widget>[
SliverAppBar(
pinned: true,
expandedHeight: 230.0,
flexibleSpace: FlexibleSpaceBar(
title: Text('复仇者联盟'),
background: Image.network(
'http://img.haote.com/upload/20180918/2018091815372344164.jpg',
fit: BoxFit.fitHeight,
),
),
),
SliverGrid.count(crossAxisCount: 4,children: List.generate(8, (index){
return Container(
color: Colors.primaries[index%Colors.primaries.length],
alignment: Alignment.center,
child: Text('$index',style: TextStyle(color: Colors.white,fontSize: 20),),
);
}).toList(),),
SliverList(
delegate: SliverChildBuilderDelegate((content, index) {
return Container(
height: 85,
alignment: Alignment.center,
color: Colors.primaries[index % Colors.primaries.length],
child: Text('$index',style: TextStyle(color: Colors.white,fontSize: 20),),
);
}, childCount: 25),
)
],
)

效果如下:

通过scrollDirectionreverse参数控制其滚动方向,用法如下:

CustomScrollView(
scrollDirection: Axis.horizontal,
reverse: true,
...
)

scrollDirection滚动方向,分为垂直和水平方向。

reverse参数表示反转滚动方向,并不是垂直转为水平,而是垂直方向滚动时,默认向下滚动,reverse设置false,滚动方向改为向上,同理水平滚动改为水平向左。

primary设置为true时,不能设置controller,因为primarytrue时,controller使用PrimaryScrollController,这种机制带来的好处是父组件可以控制子树中可滚动组件的滚动行为,例如,Scaffold正是使用这种机制在iOS中实现了点击导航栏回到顶部的功能。

controller为滚动控制器,可以监听滚到的位置,设置滚动的位置等,用法如下:

_scrollController = ScrollController();

//监听滚动位置
_scrollController.addListener((){
print('${_scrollController.position}');
});
//滚动到指定位置
_scrollController.animateTo(20.0); CustomScrollView(
controller: _scrollController,
...
)

physics表示可滚动组件的物理滚动特性,具体查看ScrollPhysics

最新文章

  1. 最长回文子串-LeetCode 5 Longest Palindromic Substring
  2. Context值和bool开关
  3. boa + ajax + cgi ajax请求cgi
  4. 轻量级OLAP(一):Cube计算
  5. How to set China Azure Storage Connection String
  6. C#:文件、路径(Path_File)
  7. magento -- 如何为商品分类(category)添加自定义属性
  8. 【shell】多命令执行顺序
  9. [ActionScript 3.0] AS3 时间格式化方法
  10. Plan9 与 Plan9port
  11. AS3之正则表达式讲解
  12. WCF实例管理的三种方式
  13. A real ROCA using Bootstrap, jQuery, Thymeleaf, Spring HATEOAS and Spring MVC
  14. Oracle查询慢, 特别是更新慢问题
  15. 如何使用SetTimer MFC 不够具体
  16. MySQL data路径为空解决方法
  17. 启动APEX
  18. 简单XSS跨站脚本攻击实验
  19. 201771010134杨其菊《面向对象程序设计java》第十周学习总结
  20. Linux之ssh登录

热门文章

  1. JAVA虚拟机08--垃圾回收--HotSpot的算法实现细节
  2. python70 前端框架之vue js的集中循环方式、key值的解释、input事件、v-model双向数据绑定、过滤案例、事件修饰符、按键修饰符、表单控制
  3. Vue + ElementUI el-input无法输入、修改、删除的问题
  4. 使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
  5. Spring(认识、IOC的开发过程、创建bean的方式)
  6. Centos7系统编译Hadoop3.3.4
  7. Android &#160;JetPack~ ViewModel (一) &#160; 介绍与使用
  8. 【KAWAKO】TVM-tflite模型编译与优化
  9. LG P4980【模板】P&#243;lya 定理
  10. 我用ChatGPT做直播技术选型,卷死了同事