var myData=0
是全局变量,我发现当我点击按钮时,var a
会改变,但var b
保持0,为什么?
顺便说一句,我读了article。
在我看来,当myData
改变时,var b by remember(myData){ mutableStateOf(myData) }
将被重新计算,因为我已经为remember
设置了一个键。
@Composable
fun ScreenHome(){
var a by remember { mutableStateOf(1) }
var b by remember(myData){ mutableStateOf(myData) }
Button(
onClick = {
a = a + 1
myData = myData + 1
},
modifier = Modifier.fillMaxWidth()
) {
Text(a.toString()+" "+b.toString()) // The b keep to display 0
}
}
PublicPar.Kt
var myData=0
2条答案
按热度按时间0ve6wy6x1#
如果
myData
只是一个常规属性,那么组合对象无法知道它何时更改以触发重组。这就是为什么需要使用快照状态保持器的原因。如上所述。yjghlzjz2#
首先,不要使用
@Compsosable
作用域之外的变量来设置键。在你的代码中,你只重组了
Button
的lambda,因为myData
中的变化不会触发重组。如果你这样改变你的函数,你会看到
MutableState
示例永远不会改变,因为没有重组。然后,如果你在Button作用域之外读取
a
,你将触发重组,并看到b示例在每次重组时都发生了变化,新的MyData
被分配给MutableState
。