var state by remember {
mutableStateOf(TextFieldValue("1231"))
}
var keepWholeSelection by remember { mutableStateOf(false) }
if (keepWholeSelection) {
// in case onValueChange was not called immediately after onFocusChanged
// the selection will be transferred correctly, so we don't need to redefine it anymore
SideEffect {
keepWholeSelection = false
}
}
TextField(
value = state,
onValueChange = { newState ->
if (keepWholeSelection) {
keepWholeSelection = false
state = newState.copy(
selection = TextRange(0, newState.text.length)
)
} else {
state = newState
}
},
modifier = Modifier
.onFocusChanged { focusState ->
if (focusState.isFocused) {
val text = state.text
state = state.copy(
selection = TextRange(0, text.length)
)
keepWholeSelection = true
}
}
)
5条答案
按热度按时间yvgpqqbh1#
在这种情况下,您应该使用
TextFieldValue
作为TextField
的状态,当它接收焦点时,您使用TextFieldValue
状态设置selection
。结果如下:
请注意,根据您的触摸,光标会转到触摸的位置,而不是选择整个文本。您可以尝试找出这是一个bug还是一个功能:)
ve7v8dk22#
@nglauber解决方案似乎不再起作用了。
调试显示
onFocusChanged
在onValueChange
之前调用,并且在一个视图生命周期内。在onFocusChanged
期间更改的选择对TextField
没有影响,因为它在onValueChange
期间被覆盖。以下是可能的解决方法:
我认为应该可以使它更容易,所以我创建了this question的组成问题跟踪。
8cdiaqws3#
我没有100%成功地使用@nglauber答案。你应该添加一个小延迟,它的效果很好。例如:
3qpi33ja4#
我写了一个Modifier扩展函数,尽管@Pylyp指出了bug,它仍然工作
用法
uubf1zoe5#
我想添加到Phil's answer中,我想动态更新状态,结果是:
它做了两件事,首先,如果
textVal
发生变化,它会更新字段,还将光标放在末尾。