Has*_*ssa 23 android kotlin android-jetpack-compose
当我从一个可组合屏幕导航到另一个屏幕时,我试图保存/记住 LazyColumn 滚动位置。即使我将 RememberLazyListState 传递给 LazyColumn,在我返回到第一个可组合屏幕后,滚动位置也不会保存。有人可以帮我吗?
@ExperimentalMaterialApi
@Composable
fun DisplayTasks(
tasks: List<Task>,
navigateToTaskScreen: (Int) -> Unit
) {
val listState = rememberLazyListState()
LazyColumn(state = listState) {
itemsIndexed(
items = tasks,
key = { _, task ->
task.id
}
) { _, task ->
LazyColumnItem(
toDoTask = task,
navigateToTaskScreen = navigateToTaskScreen
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
/**
* Static field, contains all scroll values
*/
private val SaveMap = mutableMapOf<String, KeyParams>()
private data class KeyParams(
val params: String = "",
val index: Int,
val scrollOffset: Int
)
/**
* Save scroll state on all time.
* @param key value for comparing screen
* @param params arguments for find different between equals screen
* @param initialFirstVisibleItemIndex see [LazyListState.firstVisibleItemIndex]
* @param initialFirstVisibleItemScrollOffset see [LazyListState.firstVisibleItemScrollOffset]
*/
@Composable
fun rememberForeverLazyListState(
key: String,
params: String = "",
initialFirstVisibleItemIndex: Int = 0,
initialFirstVisibleItemScrollOffset: Int = 0
): LazyListState {
val scrollState = rememberSaveable(saver = LazyListState.Saver) {
var savedValue = SaveMap[key]
if (savedValue?.params != params) savedValue = null
val savedIndex = savedValue?.index ?: initialFirstVisibleItemIndex
val savedOffset = savedValue?.scrollOffset ?: initialFirstVisibleItemScrollOffset
LazyListState(
savedIndex,
savedOffset
)
}
DisposableEffect(Unit) {
onDispose {
val lastIndex = scrollState.firstVisibleItemIndex
val lastOffset = scrollState.firstVisibleItemScrollOffset
SaveMap[key] = KeyParams(params, lastIndex, lastOffset)
}
}
return scrollState
}
Run Code Online (Sandbox Code Playgroud)
example of use
LazyColumn(
state = rememberForeverLazyListState(key = "Overview")
)
Run Code Online (Sandbox Code Playgroud)
好吧,如果你真的想保存它,你必须将它存储为类似视图模型的东西,并保留它。edremember
内容只会持续到可组合项被销毁为止。如果您导航到另一个屏幕,之前的可组合项将被销毁,滚动状态也会随之被销毁
归档时间: |
|
查看次数: |
24223 次 |
最近记录: |