Jetpack Compose LazyColumn配合Paging3时如何提取公共item逻辑
解决方案
完全可以实现,核心方案是将Part B的逻辑封装为LazyListScope的扩展函数,既保留内部的if判断+item声明逻辑,又能实现多页面复用,不会触发Paging3自动滚动问题。
LazyColumn 接收的尾部 Lambda 本身就是 LazyListScope 的上下文,只有在这个上下文里才能调用item、items这类列表项声明方法,所以我们直接对LazyListScope做扩展,就能把内部的item逻辑完全封装进去,和原生写法的执行逻辑没有任何差异。
步骤1:提取公共扩展函数
将公共逻辑封装到可全局调用的LazyListScope扩展函数中,可变的业务逻辑通过参数传入:
fun LazyListScope.renderPagingStateFooter( refresh: LoadState, append: LoadState, itemCount: Int, // 空态展示内容,不同页面可自定义 emptyContent: @Composable () -> Unit, // 加载/错误状态展示内容,不同页面可自定义 loadStateContent: @Composable () -> Unit ) { // 和原逻辑完全一致的判断,item声明完全包裹在if内部,不会生成多余item if (refresh is LoadState.NotLoading && append is LoadState.NotLoading) { if (itemCount == 0) { item { emptyContent() } } } else { item { loadStateContent() } } }
如果你的业务侧空态、加载重试样式是统一的,还可以给参数加上默认值,进一步简化调用成本。
步骤2:原页面调用
替换原来的Part B逻辑即可,和原生写法完全兼容:
LazyColumn(Modifier.fillMaxSize()) { // Part A 原有业务逻辑不变 items(pagingItems) { wind -> WindRow(navController, wind!!) } val refresh = pagingItems.loadState.refresh val append = pagingItems.loadState.append // 直接调用公共扩展,传入当前页面对应的自定义逻辑 renderPagingStateFooter( refresh = refresh, append = append, itemCount = pagingItems.itemCount, emptyContent = { PosterCompose() { navController.navigate("blowWind") } }, loadStateContent = { LoadStateView(path = FOLLOW_WIND_LIST, refresh = refresh, append = append) { pagingItems.retry() } } ) }
额外说明
- 该扩展不仅适用于LazyColumn,LazyRow场景也可以直接复用
- 逻辑和你原来手写在LazyColumn内部的代码完全等价,没有额外性能损耗,也不会触发Paging3自动滚动到顶部的问题
内容的提问来源于stack exchange,提问作者gaohomway
相关产品推荐
相关产品推荐

