kotlin 为什么在Android Jetpack Compose中,当全局变量mydata更改时,变量b没有更改?

6pp0gazn  于 2023-05-29  发布在  Kotlin
关注(0)|答案(2)|浏览(244)

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
0ve6wy6x

0ve6wy6x1#

如果myData只是一个常规属性,那么组合对象无法知道它何时更改以触发重组。这就是为什么需要使用快照状态保持器的原因。如上所述。

yjghlzjz

yjghlzjz2#

首先,不要使用@Compsosable作用域之外的变量来设置键。
在你的代码中,你只重组了Button的lambda,因为myData中的变化不会触发重组。
如果你这样改变你的函数,你会看到MutableState示例永远不会改变,因为没有重组。

@Preview
@Composable
fun ScreenHome(){
    var a by remember {  mutableStateOf(1)    }
    val b = remember(myData) { mutableStateOf(myData) }

    Column(
        modifier = Modifier.padding(20.dp)
    ) {
        
        Text(text = "b: $b")

        Button(
            onClick = {
                a = a + 1
                myData = myData + 1
            },
            modifier = Modifier.fillMaxWidth()
        ) {
            Text("a: $a, myData: $myData, b: $b")     // The b keep to display 0
        }

    }
}

然后,如果你在Button作用域之外读取a,你将触发重组,并看到b示例在每次重组时都发生了变化,新的MyData被分配给MutableState

@Preview
@Composable
fun ScreenHome(){
    var a by remember {  mutableStateOf(1)    }
    val b = remember(myData){ mutableStateOf(myData) }

    Column(
        modifier = Modifier.padding(20.dp)
    ) {

        // Reading a triggers recomposition
        Text(text = "a: $a, b: $b")

        Button(
            onClick = {
                a = a + 1
                myData = myData + 1
            },
            modifier = Modifier.fillMaxWidth()
        ) {
            Text("a: $a, myData: $myData, b: $b")     // The b keep to display 0
        }

    }
}

相关问题