SuperAPI AI 工具集

lazy-scroll-helper-kit

前端与建站

查看项目

更新于 10-17 16:15

技能介绍

用途

lazy-scroll-helper-kit 提供四个用于 Jetpack Compose Lazy 列表(LazyListState)的小型 Kotlin 辅助函数,每个只有寥寥几行,目标是可在多个应用之间携带复用。文档强调这些工具都读取 layoutInfo,即最近一次完成的布局,而不是下一次布局,因此各自的失效模式只有在真实列表中才会暴露。

主要能力

  1. 滚动方向作为派生状态:isScrollingUp() 返回 State<Boolean>,调用方可用 val up by state.isScrollingUp() 在需要的作用域内读取。当 firstVisibleItemIndex 为 0 时始终返回“向上”,避免列表顶部因惯性滑动隐藏滚动条。
  2. 条目居中滚动:animateScrollAndCentralizeItem(index) 在目标条目不在可见窗口时先 scrollToItem 触发测量,再用 withFrameNanos { } 等待一帧,随后按视口中心与条目中心的差值执行 animateScrollBy(300ms tween)。
  3. 可见百分比:visibilityPercent(info) 以视口起止偏移裁掉条目上下被遮挡部分,计算条目可见高度占比。
  4. 按绝对索引查询可见条目:getVisibleItemInfoFor(absoluteIndex) 通过 visibleItemsInfo 的索引偏移查找对应条目。

使用方式

资料给出的是 Kotlin 源码片段,未提供安装命令或依赖配置。基本用法是把这些扩展函数放入项目,并在 Composable 中通过 LazyListState 调用;remember 需以状态对象为键(remember(this)),以便切换列表时重置基线。

适用场景

适用于需要在 Compose Lazy 列表中实现“随滚动隐藏/显示顶栏”、将指定条目滚动到居中位置、判断条目可见比例、按索引定位可见条目等交互的 Android 界面开发。

限制与陷阱

  • 方向辅助函数在 derivedStateOf 内部写状态,使该代码块不再是纯函数,结果取决于最后一次读取的时机。
  • 列表增长(追加分页或在视口上方插入)会改变 firstVisibleItemIndex,被误判为用户滚动;需借 totalItemsCount 的 snapshotFlow 在尺寸变化时重置基线。
  • layoutInfo 比当前滚动慢一帧;同一 suspend 函数内“先滚动再测量”读到的是滚动前的布局,withFrameNanos { } 是让布局先执行的最廉价方式。
  • animateScrollToItem 是确定性的:把条目首边放到视口起点加 scrollOffset 像素处,不参考条目尺寸,因此无法直接居中;居中需要负的 scrollOffset,而该值在布局完成前无法计算。
  • visibleItemsInfo.first() 在空列表或首次布局前会抛异常,getOrNull 并不能保护它。
  • 索引减法假设可见窗口是连续区间;存在 pinned 或 sticky 条目时该假设不成立,应改用 firstOrNull { it.index == target } 扫描。
  • 可见百分比是相对条目自身高度:高于视口的条目永远达不到 100%,可见高度相同的两个条目可能报告不同数值。

验证方法

资料建议用 grep 查找 withFrameNanos、visibleItemsInfo 以及 LazyListState/LazyGridState 扩展函数定义,并手动测试:长列表双向惯性滑动观察滚动条、滚动到远处条目确认居中、滚动条隐藏时追加一页确认其不会自行移动。