这将是一篇简短的文章,展示如何解决我在使用Jetpack Compose 1.2.1和导航撰写版本2.5.0构建此应用程序时发现的一个令人沮丧的问题。问题是LazyColumn无法“记住”其滚动位置,这意味着要转到列表的开头,导航到详细信息屏幕,然后返回主列表。我们都知道,这不是一个好的用户体验,这就是为什么我努力修复这个bug。这就是我遇到这个问题的原因,它概括了这个问题。
修复:有一个解决方法,如下所示并已解释:
@Composable
fun <T : Any> LazyPagingItems<T>.rememberLazyListState(): LazyListState {
// After recreation, LazyPagingItems first return 0 items, then the cached items.
// This behavior/issue is resetting the LazyListState scroll position.
// Below is a workaround. More info: https://issuetracker.google.com/issues/177245496.
return when (itemCount) {
// Return a different LazyListState instance.
0 -> remember(this) { LazyListState(0, 0) }
// Return rememberLazyListState (normal case).
else -> androidx.compose.foundation.lazy.rememberLazyListState()
}
}
那么如何使用上述函数呢?如您所见,它是LazyPagingItems<T>
类型的扩展函数,意味着您可以在MovieList.kt
中如下使用它。应用程序中的kt文件链接。
@Composable
fun MovieList(
movies: Flow<PagingData<Movie>>,
modifier: Modifier,
onMovieClick: (movie: Movie) -> Unit
) {
val lazyMovieItems = movies.collectAsLazyPagingItems()
val listState = lazyMovieItems.rememberLazyListState()
LazyColumn(
verticalArrangement = Arrangement.spacedBy(8.dp),
modifier = modifier,
state = listState
) {
itemsIndexed(lazyMovieItems) { index, movie ->
if (index == 0) {
Spacer(modifier = Modifier.padding(4.dp))
}
MovieItem(
movie = movie!!,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp)
.clickable { onMovieClick(movie) }
)
}
...
}
}
如果这让您感到困惑,那么也许您可以为您的扩展功能使用不同的名称,但这将起到作用,直到 Google 发布修复程序。
快乐编码!