为什么链式可变状态不更新?

Yar*_*arh 3 android-jetpack-compose

dialdValue 的值永远不会更新。它总是具有值“A” 如何正确链接 mutableStates?

@Composable
fun DropDownDemo() {
    var expanded by remember { mutableStateOf(false) }
    val items = listOf("A", "B", "C", "d", "E", "F")
    var selectedIndex by remember { mutableStateOf(0) }
    var disabledValue by remember { mutableStateOf(items[selectedIndex]) }
    Log.e("mcheck", "$selectedIndex $disabledValue")
    Box(
        modifier = Modifier
            .fillMaxSize()
            .wrapContentSize(Alignment.TopStart)
    )
    {
        Text(
            items[selectedIndex],
            modifier = Modifier
                .fillMaxWidth()
                .clickable(onClick = { expanded = true })
                .background(Color.Gray)
        )
        DropdownMenu(
            expanded = expanded,
            onDismissRequest = { expanded = false },
            modifier = Modifier
                .fillMaxWidth()
                .background(Color.Red)
        ) {
            items.forEachIndexed { index, s ->
                DropdownMenuItem(onClick = {
                    selectedIndex = index
                    expanded = false
                }) {
                    var disabledText = if (s == disabledValue) {
                        " Disabled"
                    } else {
                        ""
                    }
                    Text(text = s + disabledText)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*ína 7

实际上你根本不需要disabledValueStateremember编辑,所以简单地

val disabledValue = items[selectedIndex]
Run Code Online (Sandbox Code Playgroud)

这是你在这里能做的最好的事情。这是因为从数组列表中按索引获取项目并不昂贵,并且您的可组合项必须在每次selectedIndex更改时重新组合。

并回答您的问题“如何正确链接 mutableStates?” - 如果其中一种情况并非如此,则有一个derivedStateOf适用于此类情况的方法。

例如,如果计算有点昂贵:

val list = ...
var selectedId by remember { mutableStateOf("...") }
val disabledValue by remember {
    derivedStateOf {
        list.find { it.id == selectedId }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,在列表中搜索是相当昂贵的计算。对于,只有当发生变化derivedStateOf时才会执行。selectedId当您的可组合项由于其他更改而被重组时,derivedStateOf将使用缓存值并保存您的计算。

在这个例子中:

val listState = rememberLazyListState()
val toolbarElevation by remember {
    derivedStateOf {
        if (listState.firstVisibleItemIndex == 0) 0.dp else 8.dp
    }
}

TopAppBar(
    elevation = toolbarElevation
)
Run Code Online (Sandbox Code Playgroud)

listState.firstVisibleItemIndex当您滚动时,它会经常发生变化,但是您的可组合项只有在从 0 更改为 1 时才必须重新组合,反之亦然,这就是derivedStateOf为您所做的。

derivedStateOf也适用于你的情况,但就像我说的,这是没有必要的。