From be19d0a9cf3cc74a6ba057ba199fa0c6a95d4223 Mon Sep 17 00:00:00 2001 From: maxmoney21m Date: Fri, 10 Mar 2023 10:55:59 +0800 Subject: [PATCH] Add persistent lazy list state composable --- .../amethyst/ui/screen/LazyListState.kt | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LazyListState.kt diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LazyListState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LazyListState.kt new file mode 100644 index 000000000..e6eb0c39e --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LazyListState.kt @@ -0,0 +1,34 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.saveable.rememberSaveable + +private val savedScrollStates = mutableMapOf() +private data class ScrollState(val index: Int, val scrollOffset: Int) + +@Composable +fun rememberForeverLazyListState( + key: String, + initialFirstVisibleItemIndex: Int = 0, + initialFirstVisibleItemScrollOffset: Int = 0 +): LazyListState { + val scrollState = rememberSaveable(saver = LazyListState.Saver) { + val savedValue = savedScrollStates[key] + val savedIndex = savedValue?.index ?: initialFirstVisibleItemIndex + val savedOffset = savedValue?.scrollOffset ?: initialFirstVisibleItemScrollOffset + LazyListState( + savedIndex, + savedOffset + ) + } + DisposableEffect(Unit) { + onDispose { + val lastIndex = scrollState.firstVisibleItemIndex + val lastOffset = scrollState.firstVisibleItemScrollOffset + savedScrollStates[key] = ScrollState(lastIndex, lastOffset) + } + } + return scrollState +}