kotlin 在Jetpack编写中将值设置为TextFieldValue(“”)时,未触发基本文本字段的onValueChange

5vf7fwbs  于 2023-02-09  发布在  Kotlin
关注(0)|答案(2)|浏览(188)

我想在Jetpack Compose中BasicTextfield的值更改时执行一些代码。
在以下两种情况下一切正常:

  • 任何数值变化。
  • 如果使用设备键盘清除了所有文本字段值

但是,当我尝试更改状态值为空文本点击按钮,使用以下代码:

textfieldstate.value = TextFIeldValue("")

不触发onValueChange。
不过如果我将其设置为任何其他值,就会触发onValueChange。

textfieldstate.value = TextFIeldValue("FOO")

按钮/图标点击代码:

Icon(modifier = Modifier.clickable {
              textfieldstate.value = TextFieldValue("")
 }) {.....}

当从外部按钮单击事件中清除字段值时,是否有方法触发BasicTextField的onValueChange?

ki1q1bka

ki1q1bka1#

如果你想一次做这一切,这是更多的建议,我会这样做:

@Composable
fun AppContent(
  viewModel: MyViewModel
) {
  val state by viewModel.uiState.collectAsState()
  MyPanel(
    state = MyViewModel,
    onValueChange = viewModel::onValueChange,
    onClickButton = viewModel::onClickButton
  )
}

@Composable
fun MyPanel(
  state: MyTextFieldState,
  onValueChange: (String) -> Unit,
  onClickButton: () -> Unit
) {
   TextField(
    value = state.text,
    onValueChange = onValueChange(it)
   )
   Button(
    onClick = { onClickButton() }
   ) {
    ...
   }
}

class MyViewModel: ViewModel() {
  private val _uiState = MutableStateFlow(MyUiState())
  val uiState = _uiState.asStateFlow()

  fun onValueChange(str: String) {
    _uiState.value = _uiState.value.copy(text = str)
  }

  fun onClickButton() {
    _uiState.value = _uiState.value.copy(text = "")
  }
}

data class MyUiState(
  val text: String = ""
)

上面的代码主要是提升TextField的状态,处理viewModel中的所有事情,用数据类 Package 一层UI状态,如果有其他的需求,也可以添加不同的参数,比如如果TextField有错误,可以写成:

data class MyUiState(
  val text: String = "",
  val isTextError: Boolean = false
)
nbysray5

nbysray52#

onValueChange回调函数对于获取用户输入文本的最新状态非常有用,如果你想在(textFieldValue)的状态改变时触发一些动作,你可以使用像LaunchedEffect这样的副作用。
比如:

var textFieldValue by remember() {
    mutableStateOf(TextFieldValue("test" ))
}

LaunchedEffect(textFieldValue) {
    //doSomething()
}

BasicTextField(
    value = textFieldValue,
    onValueChange = {
        textFieldValue = it
    }
  )

OutlinedButton(
    onClick = { textFieldValue = textFieldValue.copy("") }
) {
    Text(text = "Button")
}

相关问题