【问题标题】:Jetpack compose doesn't recompose on mutableStateOf changeJetpack compose 不会在 mutableStateOf 更改时重新组合
【发布时间】:2021-06-08 18:26:27
【问题描述】:

我想构建一个非常简单的演示。一个可以点击的按钮,它会计算点击次数。

代码如下:

class MainActivity : ComponentActivity() {
    private var clicks = mutableStateOf(0)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
           Surface(color = MaterialTheme.colors.background) {
                NewsStory(clicks.value) { onClick() }
           }
        }
    }

    private fun onClick() {
        clicks.value++
    }
}

@Composable
fun NewsStory(clicks: Int, onClick: () -> Unit) {
    Column(modifier = Modifier.padding(8.dp)) {
        Button(onClick = onClick) {
            Text("Clicked: $clicks")
        }
    }
}

据我了解,每次单击按钮时都应重新组合,因为 clicks 已更改。

但它不起作用,任何想法我在这里做错了什么?

我在 androidx.activity:activity-compose:1.3.0-beta01,kotlin 1.5.10 并编写版本 1.0.0-beta08

【问题讨论】:

  • 代码应该可以工作,尝试清理你的项目并重建它。

标签: android kotlin android-jetpack-compose


【解决方案1】:

您需要每次都使用“remember”关键字进行重组,如下所述:https://foso.github.io/Jetpack-Compose-Playground/general/state/

简而言之,您的可组合将如下所示:

    @Composable
fun NewsStory (){
val clickState = remember { mutableStateOf(0) }
Column (modifier = Modifier.padding(8.dp)) {
        Button(
            onClick = { clickState.value++ }) {
        }
        Text("Clicked: $clickState.value.toString()")
    }
}

【讨论】:

  • 感谢您的回答。您将val clickState = remember { mutableStateOf(0) } 放在可组合中,这是要求吗?在我的代码中,clickState 在 Activity 中,这也是一种可能吗?如果我要使用 ViewModel,我会把它放在哪里?
  • “remember”关键字仅适用于 Composables。如果你要使用 viewModel,你可以把它作为参数传递给你的 Composable,就像在这个例子中一样:developer.android.com/jetpack/compose/…
猜你喜欢
  • 2022-11-03
  • 2023-01-19
  • 2021-01-05
  • 2021-07-18
  • 2022-11-30
  • 2022-11-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多