ScalingLazyColumnState.kt

package androidx.wear.compose.material

import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.saveable.Saver
import androidx.compose.runtime.saveable.listSaver
import androidx.compose.runtime.saveable.rememberSaveable

/**
 * Creates a [ScalingLazyColumnState] that is remembered across compositions.
 */
@Composable
public fun rememberScalingLazyColumnState(): ScalingLazyColumnState {
    return rememberSaveable(saver = ScalingLazyColumnState.Saver) {
        ScalingLazyColumnState()
    }
}

/**
 * A state object that can be hoisted to control and observe scrolling.
 * TODO (b/193792848): Add scrolling and snap support.
 *
 * In most cases, this will be created via [rememberScalingLazyColumnState].
 */
@Stable
public class ScalingLazyColumnState {

    internal var lazyListState: LazyListState = LazyListState(0, 0)

    companion object {
        /**
         * The default [Saver] implementation for [ScalingLazyColumnState].
         */
        val Saver: Saver<ScalingLazyColumnState, *> = listSaver(
            save = {
                listOf(
                    it.lazyListState.firstVisibleItemIndex,
                    it.lazyListState.firstVisibleItemScrollOffset
                )
            },
            restore = {
                var scalingLazyColumnState = ScalingLazyColumnState()
                scalingLazyColumnState.lazyListState = LazyListState(
                    firstVisibleItemIndex = it[0],
                    firstVisibleItemScrollOffset = it[1]
                )
                scalingLazyColumnState
            }
        )
    }
}