探索Flutter Sliver 家族:打造流畅的复杂滚动体验

目录

[一些常见的 Sliver 小部件及其用途](#一些常见的 Sliver 小部件及其用途)

[SliverPersistentHeader 与 SliverAppBar 的区别](#SliverPersistentHeader 与 SliverAppBar 的区别)

为什么重复造轮子

额外补充


Flutter 的 Sliver 家族是一组专为构建复杂的滚动效果而设计的小部件。在 Flutter 中,Slivers 主要用于自定义滚动视图,允许开发者实现各种复杂的滚动效果和布局。Slivers 特别适合构建那些需要精细滚动控制的高级布局,比如可折叠的应用栏(App Bars)、懒加载列表、网格布局等。

一些常见的 Sliver 小部件及其用途

  • SliverAppBar:这是一个非常流行的 Sliver 小部件,它可以创建一个在页面滚动时动态变化的应用栏。SliverAppBar 可以配置成展开时有一个大的标题和背景图片,而在向上滚动时缩小并固定在页面顶部。

  • SliverList:这个小部件用于显示一个线性的列表项目。它工作在 Sliver 家族中,可以在滚动视图中用来展示一系列的子部件。

  • SliverFixedExtentList:这是一个特定高度项的 SliverList。它要求所有的子项有相同的固定高度,这可以优化性能,因为所有的子项渲染高度是预先知道的。

  • SliverGrid:这个小部件用于创建网格布局。它可以显示多列的子部件,并且每个子部件可以是相同或不同的大小。SliverGrid 对于展示产品目录、图片库等场景非常有用。

  • SliverPadding:这个小部件用于给 Sliver 小部件添加填充。它可以确保 Sliver 小部件在滚动视图中有正确的边距。

  • SliverToBoxAdapter:这个小部件用于将常规的小部件插入到 Sliver 家族中。如果你有一个非 Sliver 的小部件但想要在 Sliver 列表中显示,可以使用 SliverToBoxAdapter 来实现。

Dart 复制代码
CustomScrollView(
  slivers: <Widget>[
    SliverToBoxAdapter(
      child: Container(
        height: 200.0,
        color: Colors.blue,
        child: Center(
          child: Text('我不是 Sliver 小部件'),
        ),
      ),
    ),
    SliverList(
      delegate: SliverChildBuilderDelegate(
        (context, index) => ListTile(
          title: Text('列表项 $index'),
        ),
        childCount: 100,
      ),
    ),
  ],
)
  • SliverPersistentHeader:这个小部件用于创建在滚动时会保持可见的头部。它可以定制和实现复杂的滚动效果,比如渐变的标题栏。

  • SliverFillRemaining:这个小部件用于填充滚动视图的剩余空间。它常用于创建一个填满屏幕剩余部分的小部件,无论剩余空间有多大。

SliverPersistentHeader 与 SliverAppBar 的区别

看了上面你可能会觉得这两个控件好像干的一个事,但这里额外解释:

  • SliverAppBar 是专门用于创建应用栏的,它提供了许多现成的配置选项,如自动隐藏、展开/收缩的效果、背景图片等。
  • SliverPersistentHeader 提供了更高的定制性,可以使用它来创建任何种类的滑动持续可见的头部组件,不仅仅是应用栏。

为什么重复造轮子

不知道你是否疑惑,已经有了ListView 和 GridView 这种处理列表和网格布局的高级小部件,为什么还要SliverList,SliverGrid呢。

对于更复杂的滚动布局需求,比如自定义滚动动画、滚动时的动态布局变化或者是在同一个滚动视图中混合使用不同类型的内容布局(例如列表和网格的组合),ListView 和 GridView 的功能可能就显得不够灵活和强大。

SliverList 和 SliverGrid 作为 Sliver 家族的一部分,它们提供了更高的灵活性和控制能力来构建复杂的滚动布局。通过使用 Slivers,开发者可以创建高度定制化的滚动效果和布局,这些在使用 ListView 和 GridView 时很难或无法实现。

具体复杂的滚动场景包括:

  1. 动态头部: 如在滚动时改变大小的头部或导航栏。
  2. 混合布局: 在同一个滚动视图中混合使用列表、网格、固定头部等不同的布局。
  3. 复杂的交互效果: 如滚动视图内部的元素在滚动时出现或消失的动态效果。

额外补充

直接在 ScrollView(比如 SingleChildScrollView)中嵌入 ListView 是不推荐的,因为这会导致两个滚动视图互相冲突,理想的做法是使用 SliverList 或者将 ListView 的 shrinkWrap 属性设置为 true,让 ListView 的大小自适应其内容,但这仍可能带来性能问题。

相关推荐
2501_941875281 小时前
从配置中心到动态管理的互联网工程语法演进与多语言实践分享
开发语言·python
hfywmsj1 小时前
广州餐饮铺位招租决策模型:多因子选址系统设计
开发语言·人工智能·python·广州餐饮铺位招租
mldong3 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
努力的lpp3 小时前
php反序列化一(大白话版)
开发语言·web安全·php·ctf·反序列化
2分钟速写快排3 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
菜鸟~noob2333 小时前
【电子战】第03篇:CFAR(恒虚警)处理【含matlab代码】
开发语言·matlab
passerby60614 小时前
如何自己造一个时间处理库
前端·javascript·github
flower_drop4 小时前
基于 WebUSB 与 CDP:在浏览器端实现 Android 设备通信与无证书抓包实践
android·chrome·测试工具·adb·bug·edge浏览器
泡海椒4 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb4 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析