Jetpack Compose 中是否有一种方法可以在 TextField
中输入的每个字符在实际显示之前使用 mapper : (String) -> String
函数进行处理,该函数可能会随着时间的推移而改变。
我尝试用 TextField 实现这个
var value by remember { mutableStateOf("") }
TextField(value = value, onValueChange = {
//I could perform manipulation here
value = it
})
但它不起作用,因为它正在操纵整个文本而不是最近的字符。此外,在此过程中更改光标位置或更改映射器功能时会导致可预测的行为
注意:VisualTransformation
也不合适。它应用于整个文本
我认为我们必须从另一层解决这个问题。有没有办法在 Jetpack Compose 中实现这种行为?
答案 0 :(得分:1)
我在使用 compose 实现文本验证 UI 时遇到了类似的挑战。由于输入焦点未处于就绪状态,我最终对仅需要数字的输入执行以下操作。
onValueChange = {
// only accept the first number value entered
number = it.text.replace(Regex("\\D"), "").take(1)
// move to the next field
if (number.isNotEmpty()) {
nextFocus?.requestFocus() ?: run {
onVerifyPin?.invoke()
}
}
}
使用正则表达式和 kotlin 的最后一个运算符,您可以获得所需的结果。 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/last.html
答案 1 :(得分:-1)
如果你只是做这样的事情:
TextField(
label = { Text("Name") },
value = nameState,
onValueChange = { s: String ->
if (!s.contains('b')) { // <<<<<< this
nameState = s
}
}
)
如果您按键盘上的“b”,则不会发生任何事情。 没有文字变化,没有光标动画变化,......没有...... 也许我没有正确理解你...