Kotlin Decompose中切换页面后计数器值未保存问题求助
Decompose组件切换后计数器状态丢失的解决方法
问题核心:从SecondComponent页面返回后再次进入,计数器重置为0,是因为Decompose的ChildStack在弹出子组件时会销毁对应组件实例,内存中的状态随之丢失。
解决方案:利用Decompose的StateKeeper保存状态
步骤1:让Model实现Parcelable接口
状态需要可序列化才能被StateKeeper保存,修改Model类:
import kotlinx.parcelize.Parcelize import android.os.Parcelable interface SecondComponent { val model: Value<Model> fun onIncrementClicked() fun onDecrementClicked() fun onBackClicked() @Parcelize data class Model( val count: Int = 0 ) : Parcelable }
步骤2:在组件中添加状态保存与恢复逻辑
修改DefaultSecondComponent,通过ComponentContext自带的stateKeeper完成状态的保存与恢复:
class DefaultSecondComponent( private val componentContext: ComponentContext, private val onBack: () -> Unit, ): SecondComponent, ComponentContext by componentContext{ // 初始化时优先从StateKeeper恢复状态,无则用默认值 private val state = MutableValue( stateKeeper.consume("counter_state") ?: Model() ) override val model: Value<Model> = state init { // 注册状态保存逻辑,组件销毁前自动保存当前状态 stateKeeper.register("counter_state") { state.value } } override fun onIncrementClicked() { state.update { it.copy(count = it.count + 1)} } override fun onDecrementClicked() { state.update { it.copy(count = it.count - 1) } } override fun onBackClicked() { onBack() } }
步骤3:确保项目启用Parcelize插件
在模块级别的build.gradle(或build.gradle.kts)中添加插件:
plugins { // 其他已存在的插件... id 'kotlin-parcelize' }
完成以上修改后,返回再进入SecondComponent时,计数器会恢复到之前的数值,不会重置为0。
内容的提问来源于stack exchange,提问作者xlzpm
相关产品推荐
相关产品推荐

