flutter滚动视图之ScrollDirection、ViewportOffset源码解析(一)

perl 复制代码
/// 滚动的方向,相对于由 [AxisDirection] 和 [GrowthDirection] 定义的
/// 正向滚动偏移轴。
///
/// 它和 [GrowthDirection] 类似,但不同的是它多了一个第三个值 [idle],
/// 表示当前没有滚动的状态。
///
/// 例如,在 [RenderSliverFloatingPersistentHeader] 中,它会用这个枚举
/// 来判断只有当用户滚动方向与检测到的滚动偏移变化方向一致时才会展开。
///
/// {@template flutter.rendering.ScrollDirection.sample}
/// 下面是一个示例:
/// 一个带有 [CustomScrollView] 的页面,
/// 在 [AppBar.bottom] 中用 [Radio] 按钮改变 [AxisDirection],
/// 以演示不同的配置。
/// 同时通过 [NotificationListener] 监听 [UserScrollNotification],
/// 当 [ScrollDirection] 发生变化或停止时,会触发通知。
/// {@endtemplate}
///
/// 相关内容:
///
///  * [AxisDirection]:方向性更强的枚举(值是 left/right/up/down)
///  * [GrowthDirection]:表示 Sliver 内容的增长顺序
///  * [UserScrollNotification]:当 [ScrollDirection] 变化时会发通知
enum ScrollDirection {
  /// 没有滚动(静止状态)
  idle,

  /// 向"负滚动偏移"方向滚动。
  ///
  /// 举例:对于一个垂直方向向下 [AxisDirection.down]、
  /// 且 [GrowthDirection.forward] 的列表(Flutter 默认情况),
  /// 这个方向意味着内容向下移动,显示出**更早的内容**(靠近 0 位置)。
  ///
  /// 可以记成:forward(前进)是"朝向"零位置。
  forward,

  /// 向"正滚动偏移"方向滚动。
  ///
  /// 举例:同样对于一个垂直方向向下 [AxisDirection.down]、
  /// 且 [GrowthDirection.forward] 的列表,
  /// 这个方向意味着内容向上移动,显示出**更晚的内容**(离 0 位置更远)。
  ///
  /// 可以记成:reverse(后退)是"远离"零位置。
  reverse,
}

原理解释

ScrollDirection 是一个非常小但核心的枚举,作用是抽象化"滚动的方向":

  • 它不是简单的 up/down 或 left/right,而是基于"滚动偏移轴"的正负方向来判断。

  • 依赖的两个关键概念

    • AxisDirection:轴的物理方向(上/下/左/右)
    • GrowthDirection:内容在这个轴上排列的增长方向(forward/backward)
  • Flutter 的滚动体系中,实际滚动时偏移量是关键指标。

    • 偏移量增大 → ScrollDirection.reverse
    • 偏移量减小 → ScrollDirection.forward
    • 偏移量不变 → ScrollDirection.idle
  • 它是逻辑方向,不是物理方向

    物理上可能是"向上滑手指",但逻辑上却可能是 forward 或 reverse,这取决于 AxisDirection 和 GrowthDirection 的组合。

相关推荐
ZC跨境爬虫6 小时前
跟着 MDN 学 HTML day_37:(深入掌握 CustomEvent 自定义事件接口)
前端·javascript·ui·html·音视频
码海扬帆:前端探索之旅13 小时前
深度定制 uni-combox:新增功能详解与实战指南
前端·vue.js·uni-app
谷雨不太卷13 小时前
进程的状态码
java·前端·算法
打小就很皮...13 小时前
基于 Python + LangChain + RAG 的知识检索系统实战
前端·langchain·embedding·rag
BJ-Giser13 小时前
Cesium 烟雾粒子特效
前端·可视化·cesium
空中海13 小时前
02 ArkTS 语言与工程规范
java·前端·spring
YJlio13 小时前
7.4.5 Windows 11 企业网络连接与网络重置实战:远程访问、本地策略与故障恢复
前端·chrome·windows·python·edge·机器人·django
Slow菜鸟13 小时前
Codex CLI 教程(五)| Skills 安装指南:面向 Java 全栈工程师打造个人 ECC(V1版)
大数据·前端·人工智能
Lee川13 小时前
打字机是怎么炼成的:Chat 流式输出深度解析
前端·后端·面试
前端若水13 小时前
过渡(transition)高级:贝塞尔曲线、硬件加速
前端·css·css3