android 记住,当jetpack合成中的值发生变化时,不要重新合成

iszxjhcz  于 2022-11-27  发布在  Android
关注(0)|答案(1)|浏览(203)

我正在增加一个值,我想在这个基础上改变文本的颜色。当我的值改变时,我的文本颜色没有改变。

完全配对状态

@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也会改变。

nle07wnf

nle07wnf1#

在这种情况下,您根本不需要remember- Compose已经永远不会更改pairButtonColor所依赖的任何内容,除非selectedIndexOfAvailableItem发生更改,因此只需删除remember并写入:

val pairButtonColor =  if (selectedIndexOfAvailableItem != -1) {
    Color.Blue
} else {
    Color.Yellow
}

但是要理解为什么remember不工作,了解remember { }在做什么是很重要的。

val pairButtonColor = remember {
  // ...
}

代码块中的代码只运行一次,它返回的值被记住(这就是remember的全部意义)。
这就是为什么remember也有一个接受单个密钥或多个密钥的版本:
如果keys的所有值都等于前面的组合,请记住calculation [您的代码块]返回的值,否则通过调用calculation生成并记住一个新值。
这意味着如果你想在selectedIndexOfAvailableItem改变时重新运行remember,那么它需要是你使用的键之一:

val pairButtonColor = remember(selectedIndexOfAvailableItem) {
    if (selectedIndexOfAvailableItem != -1) {
        Color.Blue
    } else {
        Color.Yellow
    }
}

但是根据Best practices around using remember,像这样使用remember(其中数据源已经是一个记忆值)主要是为了避免昂贵的计算(即,如果代码块重新运行非常昂贵,pairButtonColor上的remember可能会有帮助)或依赖于快速变化的记忆值的计算(其中remember + derivedStateOf有助于提高性能)。
在您的情况下,这两个都不适用-if检查根本不需要remember

相关问题