android 记住,不要以工作为好而重新启动

50few1ms  于 2023-04-18  发布在  Android
关注(0)|答案(2)|浏览(102)

最近我在编写时遇到了一个remember的问题;我有两个简单的、可组合的函数,如下所示:

@Composable
fun foo() {
    var x = remember { 1 }
    x += 1
    Text("$x")
}

@Composable
private fun MainScreen() {
    var state by remember { mutableStateOf(1) }
    Column {
        foo()
        Button(onClick = { state += 1 }) {
            Text("Update Offer $state")
        }
    }
}

我希望当点击按钮时,foo()重新组合,x增加,但这不起作用,x总是2。有人能解释为什么它不像我预期的那样起作用吗?

nimxete2

nimxete21#

您使用remember将x的初始值存储为1。Remember是一个可组合的函数,它返回一个在重组过程中被记住的值。这意味着x不会改变,除非键改变。在您的例子中,键总是1,所以x总是1 + 1 = 2。
对于x,应该使用mutablestate而不是remember。Mutablestate是一种存储可以更改的值并在更改时触发重组的方法。您可以使用mutableStateOf创建可变状态并委托状态的getter和setter。

hzbexzde

hzbexzde2#

正如Ammirhossein所说,问题是remember使用引用,remember { 1 }总是返回1;为了解决这个问题,我稍微修改了代码如下:

data class Test(var value: Int)
var temp = Test(1)
@Composable
fun foo(state: Int) {
    var x = remember { temp }
    Column {
        Text("$x")
        Text("${temp.value}")
    }
}

@Composable
private fun MainScreen() {
    var state by remember { mutableStateOf(1) }
    Column {
        foo(state)
        Button(onClick = {
            state += 1
            temp = Test(state)
        }) {
            Text("Update Offer $state")
        }
    }
}

相关问题