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

标签 android kotlin android-jetpack-compose android-compose-textfield

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

相关文章:

java - 获取Android中的最后位置

android验证paypal支付

android - Google Play 控制台中的 Dagger Hilt 崩溃

android - NoClassDefFoundError : Failed resolution of: Lkotlinx/coroutines/Dispatchers

安卓撰写。尝试运行基本代码时出错

android - Jetpack Compose Navigation - 底部导航多个返回堆栈 - 查看模型范围问题

javascript - 需要 WebView 的帮助

android - onAdClosed() 没有在应用程序中被调用

android - Kotlin Android Studio-在类型为Intent的可为空的接收器上仅允许安全(?。)或非空声明(!!。)调用。

android - 如何将按钮中的图标向左对齐并保持文本居中