diff --git a/chiptextfield-core/build.gradle b/chiptextfield-core/build.gradle index 2099d49..beaf2a7 100644 --- a/chiptextfield-core/build.gradle +++ b/chiptextfield-core/build.gradle @@ -51,6 +51,7 @@ kotlin { dependencies { api(libs.jetbrains.compose.ui) api(libs.jetbrains.compose.foundation) + implementation(libs.androidx.compose.runtime.retain) } } } diff --git a/chiptextfield-core/src/commonMain/kotlin/com/dokar/chiptextfield/BasicChipTextField.kt b/chiptextfield-core/src/commonMain/kotlin/com/dokar/chiptextfield/BasicChipTextField.kt index 4d25271..1890348 100644 --- a/chiptextfield-core/src/commonMain/kotlin/com/dokar/chiptextfield/BasicChipTextField.kt +++ b/chiptextfield-core/src/commonMain/kotlin/com/dokar/chiptextfield/BasicChipTextField.kt @@ -324,7 +324,9 @@ fun BasicChipTextField( LaunchedEffect(state, state.disposed) { if (state.disposed) { - state.chips = state.defaultChips + if (state.resetChipsAfterLeavingComposition) { + state.chips = state.defaultChips + } state.disposed = false } } diff --git a/chiptextfield-core/src/commonMain/kotlin/com/dokar/chiptextfield/ChipTextFieldState.kt b/chiptextfield-core/src/commonMain/kotlin/com/dokar/chiptextfield/ChipTextFieldState.kt index a672af8..5eb9103 100644 --- a/chiptextfield-core/src/commonMain/kotlin/com/dokar/chiptextfield/ChipTextFieldState.kt +++ b/chiptextfield-core/src/commonMain/kotlin/com/dokar/chiptextfield/ChipTextFieldState.kt @@ -6,6 +6,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.retain.retain import androidx.compose.runtime.setValue /** @@ -35,6 +36,46 @@ fun rememberChipTextFieldState( return remember(key) { ChipTextFieldState(chips = chips) } } +/** + * Return a [ChipTextFieldState] that is retained after leaving the composition. + * + * Retained state can survive configuration changes, but it does not survive process death. Use + * [rememberChipTextFieldState] when the state should only live as long as the current composition. + * + * @param chips Default chips + */ +@Composable +fun retainChipTextFieldState( + chips: List = emptyList(), +): ChipTextFieldState { + return retain { retainedChipTextFieldState(chips) } +} + +/** + * Return a [ChipTextFieldState] that is retained after leaving the composition, recreating it when + * [key] changes. + * + * Retained state can survive configuration changes, but it does not survive process death. Use + * [rememberChipTextFieldState] when the state should only live as long as the current composition. + * + * @param chips Default chips + * @param key An input that identifies the retained state. When this value changes, the previous + * state is discarded and a new state is created with [chips]. + */ +@Composable +fun retainChipTextFieldState( + chips: List = emptyList(), + key: Any?, +): ChipTextFieldState { + return retain(key) { retainedChipTextFieldState(chips) } +} + +private fun retainedChipTextFieldState(chips: List): ChipTextFieldState { + return ChipTextFieldState(chips = chips).apply { + resetChipsAfterLeavingComposition = false + } +} + /** * State class for [BasicChipTextField] * @@ -44,6 +85,8 @@ fun rememberChipTextFieldState( class ChipTextFieldState( chips: List = emptyList() ) { + internal var resetChipsAfterLeavingComposition = true + internal var disposed = false internal var defaultChips: List = chips diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index edef76f..fd9d857 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,6 +5,7 @@ androidMinSdk = "23" kotlin = "2.4.10" coil = "3.5.0" compose-multiplatform = "1.11.1" +androidx-compose-runtime = "1.11.2" coroutines = "1.11.0" agp = "9.3.0" maven-publish = "0.37.0" @@ -29,6 +30,7 @@ coil-network = { module = "io.coil-kt.coil3:coil-network-ktor3", version.ref = " ktor-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } ktor-js = { module = "io.ktor:ktor-client-js", version.ref = "ktor" } jetbrains-compose-runtime = { module = "org.jetbrains.compose.runtime:runtime", version.ref = "compose-multiplatform" } +androidx-compose-runtime-retain = { module = "androidx.compose.runtime:runtime-retain", version.ref = "androidx-compose-runtime" } jetbrains-compose-foundation = { module = "org.jetbrains.compose.foundation:foundation", version.ref = "compose-multiplatform" } jetbrains-compose-ui = { module = "org.jetbrains.compose.ui:ui", version.ref = "compose-multiplatform" } jetbrains-compose-material = { module = "org.jetbrains.compose.material:material", version.ref = "compose-multiplatform" }