【发布时间】:2022-01-20 11:26:04
【问题描述】:
我正在使用 LazyColumn 在 Compose 中创建搜索页面,一切正常,除了 LazyColumn 在数据更改时返回到第一项的想要行为。
这是我对惰性列的实际实现:
@Composable
fun <DataType : Any> GenericListView(
itemsList: SnapshotStateList<DataType>, // this list comes from the search page viewmodel
modifier: Modifier = Modifier.fillMaxSize(),
spacing: Dp = 24.dp,
padding: PaddingValues = PaddingValues(0.dp),
item: @Composable (DataType) -> Unit
) {
val listState: LazyListState = rememberLazyListState()
val coroutineScope = rememberCoroutineScope()
LazyColumn(
verticalArrangement = Arrangement.spacedBy(spacing),
state = listState,
modifier = modifier.padding(padding)
) {
items(itemsList) {
item(it)
}
}
SideEffect {
Log.i("->->->->->->->", "side effect launched")
coroutineScope.launch {
listState.scrollToItem(0)
}
}
}
正如文档所说,每次重构函数时都应该调用SideEffect,
但它似乎只能在带有SideEffect 断点的调试模式下工作,否则,它仅在第一次创建整个页面时才有效。
我已经尝试使用LaunchedEffect 而不是SideEffect,将itemsList 用作key,但没有任何反应。
为什么我的代码只能在调试模式下工作? 或者更好的是,在设置新数据时重置位置的现有解决方案?
【问题讨论】:
标签: android kotlin android-jetpack-compose android-jetpack-compose-list