【问题标题】:Can I swich State Variable for Composable Function?我可以为可组合函数切换状态变量吗?
【发布时间】:2020-11-29 09:41:39
【问题描述】:

我有一个简单的可组合函数,如下所示

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
            }
        }
    }
}

开关会将可组合函数引用更改为不同的状态变量。切换后,当状态变量发生变化时,可组合函数不再重构。

不支持更改可组合函数的状态变量吗?或者我做错了什么。

【问题讨论】:

    标签: android android-jetpack-compose


    【解决方案1】:

    经过一番调查,显然问题在于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
                }
            }
        }
    }
    

    【讨论】:

    • :: 运算符是什么意思?又为什么会“得到最新的colorChoice”?
    • :: 只是为了访问 lambda(将其视为函数指针)
    猜你喜欢
    • 1970-01-01
    • 2022-07-04
    • 2023-02-15
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    相关资源
    最近更新 更多