我正在增加一个值,我想在这个基础上改变文本的颜色。当我的值改变时,我的文本颜色没有改变。
完全配对状态
@Composable
fun PairStateFul() {
var selectedIndexOfAvailableItem by remember { mutableStateOf(-1) }
val pairButtonColor = remember {
if (selectedIndexOfAvailableItem != -1) {
Color.Blue
} else {
Color.Yellow
}
}
Column {
PairStateLess(
pairButtonColor,
selectedIndexOfAvailableItem,
onSelectedIndexOfAvailableItem = { selectedIndexOfAvailableItem += it }
)
}
}
无成对状态
@Composable
fun PairStateLess(pairButtonColor: Color,
selectedIndexOfAvailableItem: Int,
onSelectedIndexOfAvailableItem: (Int) -> Unit,
) {
Text(
"Hello World!",
color = pairButtonColor
)
Button(onClick = {
onSelectedIndexOfAvailableItem(selectedIndexOfAvailableItem)
}) {
Text(text = "item $selectedIndexOfAvailableItem")
}
}
配对状态完整预览
@Preview(showBackground = true)
@Composable
fun PairStateFulPreview() {
PairStateFul()
}
我知道我的增加计数器逻辑是错误的。我不想解决逻辑问题。我的主要问题是当selectedIndexOfAvailableItem
改变时,我的pairButtonColor
也会改变。
1条答案
按热度按时间nle07wnf1#
在这种情况下,您根本不需要
remember
- Compose已经永远不会更改pairButtonColor
所依赖的任何内容,除非selectedIndexOfAvailableItem
发生更改,因此只需删除remember
并写入:但是要理解为什么
remember
不工作,了解remember { }
在做什么是很重要的。代码块中的代码只运行一次,它返回的值被记住(这就是
remember
的全部意义)。这就是为什么
remember
也有一个接受单个密钥或多个密钥的版本:如果
keys
的所有值都等于前面的组合,请记住calculation
[您的代码块]返回的值,否则通过调用calculation
生成并记住一个新值。这意味着如果你想在
selectedIndexOfAvailableItem
改变时重新运行remember
,那么它需要是你使用的键之一:但是根据Best practices around using remember,像这样使用
remember
(其中数据源已经是一个记忆值)主要是为了避免昂贵的计算(即,如果代码块重新运行非常昂贵,pairButtonColor
上的remember
可能会有帮助)或依赖于快速变化的记忆值的计算(其中remember
+derivedStateOf
有助于提高性能)。在您的情况下,这两个都不适用-
if
检查根本不需要remember
。