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)
实际上你根本不需要disabledValue
被State
或remember
编辑,所以简单地
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
也适用于你的情况,但就像我说的,这是没有必要的。
归档时间: |
|
查看次数: |
206 次 |
最近记录: |