计数器值未保存 Kotlin Decompose

问题描述 投票:0回答:1

我正在研究Arkady Ivanov的Decompose库,但是当更改计数器和更改屏幕时,计数器不会保存其值并重置为零。

组件接口

interface SecondComponent {
    val model: Value<Model>

    fun onIncrementClicked()
    fun onDecrementClicked()
    fun onBackClicked()

    data class Model(
       val count: Int = 0
    )
}

接口实现

class DefaultSecondComponent(
    private val componentContext: ComponentContext,
    private val onBack: () -> Unit,
): SecondComponent, ComponentContext by componentContext{
     private val state = MutableValue(Model())
     override val model: Value<Model> = state

     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()
     }
}

通过 ChildStack 创建导航

private fun secondComponent(component: ComponentContext): 
    SecondComponent =
         DefaultSecondComponent(
            componentContext = component,
            onBack = navigation::pop
         )

我尝试更改 lambda 表达式来更新变量

android kotlin android-jetpack-compose kotlin-multiplatform
1个回答
0
投票

您需要使用

StateKeeper
手动保存和恢复该值。最简单的方法是在 Gradle 模块中设置 kotlinx-serialization 库,并使用
@Serialized
注释来注释 Model 类。那么下面的代码应该会有所帮助。

class DefaultSecondComponent(
    private val componentContext: ComponentContext,
    private val onBack: () -> Unit,
): SecondComponent, ComponentContext by componentContext{
    private val state = MutableValue(stateKeeper.consume(KEY_SAVED_STATE, Model.serializer()) ?: Model())
    override val model: Value<Model> = state

    init {
        stateKeeper.register(KEY_SAVED_STATE, Model.serializer()) { state.value }
    }

    override fun onIncrementClicked() { /*...*/ }
    override fun onDecrementClicked() { /*...*/ }
    override fun onBackClicked() { /*...*/ }

    private companion object {
        private const val KEY_SAVED_STATE = "SAVED_STATE"
    }
}

您还可以查看相关的docssample

© www.soinside.com 2019 - 2024. All rights reserved.