You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:41:03