我正在研究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 表达式来更新变量
您需要使用
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"
}
}