关于Flutter的中Sliver那些事儿

举报
坚果的博客 发表于 2022/02/20 10:17:27 2022/02/20
【摘要】 SliverList的使用在此之前先来了解一下CustomScrollView,CustomScrollView是Flutter提供的可以用来自定义滚动效果的组件,它可以像胶水一样将多个Sliver粘合在一起。假如页面中同时存在一个List和一个Grid,虽然它们看起来是一个整体,但是由于各自的滚动效果是分离的,所以没法保证一致的滚动效果。而使用CustomScrollView组件作为滚动容...

SliverList的使用

在此之前先来了解一下CustomScrollView,

CustomScrollViewFlutter提供的可以用来自定义滚动效果的组件,它可以像胶水一样将多个Sliver粘合在一起。

假如页面中同时存在一个List和一个Grid,虽然它们看起来是一个整体,但是由于各自的滚动效果是分离的,所以没法保证一致的滚动效果。

而使用CustomScrollView组件作为滚动容器,SliverListSliverGrid分别替代ListGrid作为CustomScrollView的子组件,滚动效果再由CustomScrollView统一控制,这样就可以了。

但是需要注意的是由于CustomeScrollView的子组件只能是Sliver系列,所以如果你想将一个普通组件塞进CustomScrollView,那么务必将该组件用SliverToBoxAdapter包裹

要同时滚动ListView和GridView的时候可以使用SliverList和SliverGrid

SliverList需要和CustomScrollView配合使用

delegate:SliverChildDelegate 系统提供个两个已经实现好的代理:

SliverChildListDelegate/SliverChildBuilderDelegate

花样多变的SliverPersistentHeader

通过SliverPersistentHeader,我们还可以实现sticky吸顶的效果。

SliverPersistentHeader最重要的一个属性是SliverPersistentHeaderDelegate,为此我们需要实现一个类继承自SliverPersistentHeaderDelegate


class StickyTabBarDelegate extends SliverPersistentHeaderDelegate {
​
  @override
  double get minExtent => null;
​
  @override
  double get maxExtent => null;
​
  @override
  bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) => null;
  
  @override
  Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) => null;
}

可以看到,SliverPersistentHeaderDelegate的实现类必须实现其4个方法。其中:

  • minExtent:收起状态下组件的高度;

  • maxExtent:展开状态下组件的高度;

  • shouldRebuild:类似于react中的shouldComponentUpdate

  • build:构建渲染的内容。

不过SliverPersistentHeader的神奇可远不止如此哦~我们可以通过它自定义一些头部的过渡效果,毕竟SliverAppBar也是通过它实现的,

那么这种效果要如何实现呢?关键就在于build方法中的shrinkOffset属性,它代表当前头部的滚动偏移量。我们可以根据它计算得到当前收起头部的背景颜色以及图标和文案的字体颜色,这样就能根据当前位置得到过渡效果啦~

源码地址https://blog.51cto.com/jianguo/5022953

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。