Android 喷气背包';不要在变化的状态下重新组合
我想建立一个非常简单的演示。一个你可以点击的按钮,它计算点击次数 代码如下所示:Android 喷气背包';不要在变化的状态下重新组合,android,kotlin,android-jetpack-compose,Android,Kotlin,Android Jetpack Compose,我想建立一个非常简单的演示。一个你可以点击的按钮,它计算点击次数 代码如下所示: class MainActivity : ComponentActivity() { private var clicks = mutableStateOf(0) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent {
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")
}
}
}
@Composable
fun NewsStory (){
val clickState = remember { mutableStateOf(0) }
Column (modifier = Modifier.padding(8.dp)) {
Button(
onClick = { clickState.value++ }) {
}
Text("Clicked: $clickState.value.toString()")
}
}
根据我的理解,每次点击按钮时都应该重新组合,因为点击
会发生变化
但它不起作用,你知道我做错了什么吗
我在androidx上。活动:活动组合:1.3.0-beta01、kotlin 1.5.10和组合版本1.0.0-beta08您需要使用“记住”关键字,以便每次进行重新组合,如下所述:
简言之,您的组合将如下所示:
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")
}
}
}
@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=memory{mutableStateOf(0)}
放在可组合文件中,这是一个要求吗?在我的代码中,clickState
在活动中,这也是可能的吗?如果我要使用ViewModel,我会把它放在哪里?记住关键字只在可组合中有效。如果要使用viewModel,则应将其作为参数传递给Composable,如本例所示:我刚刚尝试了清理和重建,但不幸的是,它没有工作:/