[Flutter]多层级协同滚动和多层级惯性滚动动画传递Elva Scroll View

279 阅读2分钟

Elva Scroll View,一个适用于嵌套滚动的 Flutter 包,具备多层级协同滚动和多层级惯性滚动动画传递功能。

一、效果与功能

1.1 效果演示

example.gif

1.2 支持的功能

  • 嵌套滚动支持:支持多级嵌套滚动视图,实现平滑的滚动协调
  • 惯性滚动传递:惯性滚动动画可以在多个滚动组件之间传递
  • Shell 模式:支持阻止滚动偏移继续向上传播,实现独立的滚动区域
  • 灵活的 Builder 模式:使用 Builder 模式,易于集成到现有代码中
  • 自定义通知系统:提供丰富的滚动事件通知

二、使用

2.1 安装

在项目的 pubspec.yaml 文件中添加:

dependencies:
  elva_scroll_view: ...

2.2 基础用法

ElvaScrollViewBuilder 是一个构建组件,用于包装需要协调滚动的 CustomScrollView。使用ElvaScrollViewBuilder包裹你需要协调滚动的 CustomScrollView或者其他滚动组件,即可实现滚动协调功能:

ElvaScrollViewBuilder(
  builder: (context, controller) {
    return CustomScrollView(
      controller: controller,
      slivers: [
        SliverAppBar(...),
        SliverList(...),
      ],
    );
  }
)

2.3 Shell 参数

Shell参数会中止滚动偏移继续向上传播,实现独立的滚动区域。

ElvaScrollViewBuilder(
  isShell: true,
  builder: (context, controller) {
    return CustomScrollView(
      controller: controller,
      slivers: [...]
    );
  }
)

三、核心 API

3.1 ElvaScrollViewBuilder

主要的构建组件,用于包装需要协调滚动的 CustomScrollView。

参数

  • builder: 构建函数,接收 context 和 controller
  • debugLabel: 用于日志记录的调试标签
  • isShell: 是否为 shell 组件。当为 true 时,滚动偏移不会继续向上传播

3.2 ElvaScrollViewScrollController

自定义滚动控制器,实现了 TransportPixelNode mixin,负责处理滚动协调和传递。

3.3 ElvaScrollViewPosition

自定义滚动位置管理器,继承自 Flutter 原生的 ScrollPositionWithSingleContext,实现:

  • 用户拖拽偏移处理
  • 惯性滚动启动和管理
  • 动画偏移应用

3.4 ElvaScrollViewAnimationOverscrollDispatcher

惯性滚动动画分发器,负责:

  • 收集需要接受滚动事件的组件
  • 按顺序分发惯性滚动动画
  • 管理过滚动传递

3.5 ElvaScrollViewAnimationScrollingNotification

当全局过滚动事件动画发生时分发。

属性

  • overscroll: 过滚动量
  • consumed: 当前滚动视图消耗的量

四、原理剖析

  1. [Flutter] infinity与可滚动布局
  2. [Flutter] ScrollActivity与ScrollActivityDelegate
  3. [Flutter] 多层级嵌套滚动
  4. [Flutter] 嵌套滚动与弹性嵌套滚动

五、其他:

  1. Github项目地址
  2. DartPub地址

顺便求个⭐️~