gpt4 book ai didi

android - 从暴露的 dropdownMenu 可组合、jetpack 组合中选择一个选项时,不会触发文本字段的 onValueChange

转载 作者:行者123 更新时间:2023-12-05 02:26:57 26 4
gpt4 key购买 nike

我正在尝试实现一个公开的下拉可组合项,我可以在我的 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 事件。

最佳答案

您可以简单地在 DropdownMenuItemonClick 参数中调用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com