用途:面向 Android 与 Compose 的 Paging 3 分页列表实现参考,聚焦易错的事实与规则,而非 PagingSource / Pager / collectAsLazyPagingItems 的基础用法。
主要能力:
- 版本事实:androidx.paging 3.5.0 起,paging-common、paging-compose、paging-testing 为 KMP(Android、JVM、iOS、Native、JS/Wasm),仅 paging-runtime 及 -guava/-rxjava 保持 Android 专属。纯架构领域模块只依赖 androidx.paging:paging-common,其中含无 Android 依赖的 PagingSource / PagingData / LoadResult。请以官方发布页核实版本与 KMP 支持。
- 双 Flow 规则:PagingData 是独立 Flow,不放入 UiState 字段;需分别暴露 uiState: StateFlow<UiState> 与 pagingItems: Flow<PagingData<T>>。否则任意非分页状态变化都会重建 Flow,导致缓存丢失、重新加载并把滚动重置到顶部。
- cachedIn 位置:放在链尾,位于所有 flatMapLatest、map / filter / insertSeparators 之后;放在 cachedIn 之后的转换会在每个收集者作用域重复执行,放入 flatMapLatest 内会每次筛选泄漏新缓存。
- itemKey 必填:LazyColumn 中需用稳定领域 id 作为 key,并设置 contentType;缺失则按索引复用槽位,前置页面会错位。pagingItems[i] 读取并触发边缘加载,peek(i) 只读不加载;retry() / refresh() 应在事件处理或 LaunchedEffect 中调用,不在 composable 主体内。
- RemoteMediator:离线优先时由 Room DAO 作 PagingSource,RemoteMediator 驱动网络刷新与写库;写操作包裹 db.withTransaction { },LoadType.REFRESH 时清空本地状态;全屏加载指示器依据 loadState.source.refresh + itemCount == 0,而非合并的 loadState.refresh。
- 测试:分页流是热流且不完成,不能对其用 .first() / .toList()。使用 paging-testing 的 TestPager / asSnapshot。
适用场景:Android/Compose 分页列表、离线优先仓储与分页测试。限制:未提供具体收费、平台效果等资料;以上为公开参考要点。