Android Jetpack Compose中数据类的更新策略



我尝试使用数据类中的一个对象,该对象将更新Composable并按如下方式声明它:

data class CounterState(var counter: Int = 0)
.....
val counterState: CounterState by remember { mutableStateOf(CounterState(), structuralEqualityPolicy()) }

structuralEqualityPolicy()是可组合的更新策略,定义为:

一种将MutableState的值视为等效值的策略,如果它们是在结构上相等。

如果属性计数器像使用:counterState.counter++一样发生更改,则应更新可组合项,但这不起作用。

我使用Compose版本1.0.0-alpha06

知道如何解决这个问题吗?

import androidx.compose.foundation.Text
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Button
import androidx.compose.runtime.*
import androidx.ui.tooling.preview.Preview
data class CounterState(var counter: Int = 0)
@Composable
fun dataClassRemember() {
val counterState: CounterState by remember { mutableStateOf(CounterState(), structuralEqualityPolicy()) }
Column() {
Button(onClick = {
counterState.counter++
}) {
Text(text = "Increment")
}
Text(text = "Counter value is ${counterState.counter}")
}
}
@Preview("dataClassRemember")
@Composable
fun dataClassRememberPreview() {
dataClassRemember()
}

我会试试这个:

data class CounterState(var counter: Int by remember { mutableStateOf(0)})

希望它能起作用,Anna

由于可组合在MutableState<CounterState>上观察

val counterState: CounterState by remember { mutableStateOf(CounterState(), structuralEqualityPolicy()) }

当我们执行counterState.counter++时,state变量永远不会改变,即对象的地址相同。

假设我们做这样的

counterState.value = CounterState()

这将触发状态变化。

要触发新的组合,应该更新您的mutableState值。在您的情况下,您只更新您的值的内容,而compose不知道它何时更新。你可以简单地尝试一下:

Button(onClick = {
counterState = counterState.copy(counter = counterState.counter + 1)
}) { ...

最新更新