Jetpack Compose 按钮未更新,尽管使用 mutableStateOf 实现

问题描述 投票:0回答:1

我对 Jetpack Compose 比较陌生,我遇到了一个简单的按钮单击未按预期更新数字的问题。我有一个 Counter 可组合项,它采用初始计数值和用于更新计数的 lambda。但是,尽管使用

mutableStateOf 
并传递了正确的单击处理程序,但单击按钮时计数似乎并没有增加。

这是我的

MainActivity 
代码:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            DemoTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    val post by remember {
                        mutableStateOf(Post())
                    }
                    Counter(post.likes) {
                        post.likes = it + 1
                    }
                }
            }
        }
    }
}

还有

Counter 
可组合项:

@Composable
fun Counter(postLikes: Int, onLikeClick: (Int) -> Unit) {
    val count = remember { mutableStateOf(postLikes) }
    Column(
        Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Button(
            onClick = {
                onLikeClick(count.value)
            }
        ) {
            Text("Click me")
        }
        Text(text = "Current count: ${count.value}")
    }
}

Post 
型号:

class Post(){
    var title: String = ""
    var content: String = ""
    var likes = 0
}

这看起来很简单,可以工作,但是单击按钮后计数仍然保持不变。有人可以指出这里可能出了什么问题吗?如有任何帮助,我们将不胜感激。

谢谢!

我尝试使用 Jetpack Compose 实现一个简单的计数器,单击按钮即可增加计数。以下是我采取的关键步骤:

创建了一个 Counter 可组合项,它接受初始计数值和用于计数更新的 lambda。 使用 mutableStateOf 来处理 count 变量的状态。 将此 Counter 可组合项集成到 MainActivity 中,从 Post 实例传递初始计数。 我预计点击按钮会触发 lambda 更新计数,并且 UI 中显示的计数会相应增加。

实际结果如何?

尽管执行了上述步骤,单击按钮并没有导致显示计数增加。计数保持不变,表明状态更新可能未按预期进行。

非常感谢任何见解或建议。谢谢!

android kotlin user-interface android-jetpack-compose
1个回答
0
投票

postLikes
中的
Counter
不需要包含在remember中,因为只有当
postLikes
值更新时才会重新组合。只需在
postLikes
可组合
 中使用 
Counter

© www.soinside.com 2019 - 2024. All rights reserved.