我可以为可组合函数切换状态变量吗?
Can I swich State Variable for Composable Function?
我有一个简单的可组合函数,如下所示
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var isGrayScale by remember { mutableStateOf(false) }
val colorChoice by remember(isGrayScale) {
mutableStateOf(
if (isGrayScale)
ColorChoice(onColor = Color.White, offColor = Color.Black)
else
ColorChoice(onColor = Color.Green, offColor = Color.Red)
)
}
Box(modifier = Modifier.fillMaxSize().background(colorChoice.color))
Button(
modifier = Modifier.padding(64.dp).fillMaxSize(),
onClick = { colorChoice.toggle() }) {
Text(
text = if (colorChoice.isOn) "On" else "Off",
color = colorChoice.color,
fontSize = 48.sp
)
}
Switch(
modifier = Modifier.padding(64.dp).fillMaxWidth(),
checked = isGrayScale,
onCheckedChange = {isGrayScale = !isGrayScale}
)
}
}
class ColorChoice(
private val onColor: Color,
private val offColor: Color
) {
var isOn by mutableStateOf(false)
var color by mutableStateOf(offColor)
fun toggle() {
isOn = !isOn
color = if(isOn) {
onColor
} else {
offColor
}
}
}
}
开关会将可组合函数引用更改为不同的状态变量。切换后,可组合函数在状态变量发生变化时不再重新组合。
不支持更改可组合函数的状态变量吗?或者我做错了什么。
经过一些调查,显然,问题出在 onClick = { colorChoice.toggle() }
,因此当 colorChoice
更改时,lambda 仍然存储旧的 `colorChoice。
要更正它,请将 onClick = { colorChoice.toggle() }
替换为 onClick = colorChoice::toggle
。这确保 onClick
将获得最新的 colorChoice
完整代码如下
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var isGrayScale by remember { mutableStateOf(false) }
val colorChoice by remember(isGrayScale) {
mutableStateOf(
if (isGrayScale)
ColorChoice(onColor = Color.White, offColor = Color.Black)
else
ColorChoice(onColor = Color.Green, offColor = Color.Red)
)
}
Box(modifier = Modifier.fillMaxSize().background(colorChoice.color))
Button(
modifier = Modifier.padding(64.dp).fillMaxSize(),
onClick = colorChoice::toggle) {
Text(
text = if (colorChoice.isOn) "On" else "Off",
color = colorChoice.color,
fontSize = 48.sp
)
}
Switch(
modifier = Modifier.padding(64.dp).fillMaxWidth(),
checked = isGrayScale,
onCheckedChange = {isGrayScale = !isGrayScale}
)
}
}
class ColorChoice(
private val onColor: Color,
private val offColor: Color
) {
var isOn by mutableStateOf(false)
var color by mutableStateOf(offColor)
fun toggle() {
isOn = !isOn
color = if(isOn) {
onColor
} else {
offColor
}
}
}
}
我有一个简单的可组合函数,如下所示
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var isGrayScale by remember { mutableStateOf(false) }
val colorChoice by remember(isGrayScale) {
mutableStateOf(
if (isGrayScale)
ColorChoice(onColor = Color.White, offColor = Color.Black)
else
ColorChoice(onColor = Color.Green, offColor = Color.Red)
)
}
Box(modifier = Modifier.fillMaxSize().background(colorChoice.color))
Button(
modifier = Modifier.padding(64.dp).fillMaxSize(),
onClick = { colorChoice.toggle() }) {
Text(
text = if (colorChoice.isOn) "On" else "Off",
color = colorChoice.color,
fontSize = 48.sp
)
}
Switch(
modifier = Modifier.padding(64.dp).fillMaxWidth(),
checked = isGrayScale,
onCheckedChange = {isGrayScale = !isGrayScale}
)
}
}
class ColorChoice(
private val onColor: Color,
private val offColor: Color
) {
var isOn by mutableStateOf(false)
var color by mutableStateOf(offColor)
fun toggle() {
isOn = !isOn
color = if(isOn) {
onColor
} else {
offColor
}
}
}
}
开关会将可组合函数引用更改为不同的状态变量。切换后,可组合函数在状态变量发生变化时不再重新组合。
不支持更改可组合函数的状态变量吗?或者我做错了什么。
经过一些调查,显然,问题出在 onClick = { colorChoice.toggle() }
,因此当 colorChoice
更改时,lambda 仍然存储旧的 `colorChoice。
要更正它,请将 onClick = { colorChoice.toggle() }
替换为 onClick = colorChoice::toggle
。这确保 onClick
将获得最新的 colorChoice
完整代码如下
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var isGrayScale by remember { mutableStateOf(false) }
val colorChoice by remember(isGrayScale) {
mutableStateOf(
if (isGrayScale)
ColorChoice(onColor = Color.White, offColor = Color.Black)
else
ColorChoice(onColor = Color.Green, offColor = Color.Red)
)
}
Box(modifier = Modifier.fillMaxSize().background(colorChoice.color))
Button(
modifier = Modifier.padding(64.dp).fillMaxSize(),
onClick = colorChoice::toggle) {
Text(
text = if (colorChoice.isOn) "On" else "Off",
color = colorChoice.color,
fontSize = 48.sp
)
}
Switch(
modifier = Modifier.padding(64.dp).fillMaxWidth(),
checked = isGrayScale,
onCheckedChange = {isGrayScale = !isGrayScale}
)
}
}
class ColorChoice(
private val onColor: Color,
private val offColor: Color
) {
var isOn by mutableStateOf(false)
var color by mutableStateOf(offColor)
fun toggle() {
isOn = !isOn
color = if(isOn) {
onColor
} else {
offColor
}
}
}
}