我正在尝试实现一个公开的下拉可组合项,我可以在我的 Android Jetpack Compose 应用程序的多个部分中使用它。每当我从 dropdownMenu 中选择一个项目时,selectedOption 就会在可组合项中设置并分配给显示正确项目的文本字段值。但是,不会触发显示结果的文本字段的 onValueChange 事件。这导致状态未在我的应用程序的 View 模型层中更新。遵循我的可组合代码。
// ExposedDropdownComposable.kt
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun PlantExposedSelect(
options: List<String>,
optionSelected: String,
label: String,
onOptionSelected: (String) -> Unit,
onFocusChange: (FocusState) -> Unit,
) {
var expanded by remember { mutableStateOf(false) }
var selectedOption by remember { mutableStateOf(optionSelected) }
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = {
expanded = !expanded
}
) {
TextField(
readOnly = true,
value = selectedOption,
onValueChange = onOptionSelected
label = { Text(label) },
trailingIcon = {
ExposedDropdownMenuDefaults.TrailingIcon(
expanded = expanded
)
},
colors = ExposedDropdownMenuDefaults.textFieldColors(),
modifier = Modifier
.fillMaxWidth()
.onFocusChanged {
onFocusChange(it)
},
)
ExposedDropdownMenu(
expanded = expanded,
onDismissRequest = {
expanded = false
}
) {
options.forEach { selectOption ->
DropdownMenuItem(
onClick = {
selectedOption = selectOption
expanded = false
Log.e("selectEdoption", selectedOption)
}
) {
Text(text = selectOption)
}
}
}
}
}
这是我在 AddPlantsScreen 中使用可组合项的代码
PlantExposedSelect(
options = options,
optionSelected = lightState.text,
label = lightState.hint,
onOptionSelected = {
Log.e("eventValue", it)
viewModel.onEvent(AddEditPlantEvent.EnteredLight(it))
},
onFocusChange = {
viewModel.onEvent(AddEditPlantEvent.ChangedLightFocus(it))
},
)
如何使 dropdownItem 的 onClick 事件触发显示 selectedOption 的 Textfield 的 onValueChange 事件。
最佳答案
您可以简单地在 DropdownMenuItem
的 onClick
参数中调用 onOptionSelected
,而不是使用 onValueChange
。
类似于:
@Composable
fun PlantExposedSelect(
//...
onOptionSelected: (String) -> Unit,
) {
var expanded by remember { mutableStateOf(false) }
var selectedOption by remember { mutableStateOf(optionSelected) }
ExposedDropdownMenuBox(
//....
) {
TextField(
value = selectedOption,
onValueChange = {}, //remove the function
//...
)
ExposedDropdownMenu(
/** ... **/
}
) {
options.forEach { selectOption ->
DropdownMenuItem(
onClick = {
selectedOption = selectOption
expanded = false
onOptionSelected //update your viewmodel here
}
) {
Text(text = selectOption)
}
}
}
}
}
关于android - 从暴露的 dropdownMenu 可组合、jetpack 组合中选择一个选项时,不会触发文本字段的 onValueChange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73461963/