我认为这与此有关于TextField在配置更改时失去焦点的问题有关。
一个可能的临时解决方案是使用rememberSaveable
将修改器onFocusChanged
的焦点布尔值变化保存到变量中,然后使用LaunchedEffect
在进入组合时将焦点恢复到TextField
。
val focusRequester = remember { FocusRequester() }
var isFocused by rememberSaveable { mutableStateOf(false) }
LaunchedEffect(true) {
if (isFocused) {
focusRequester.requestFocus()
}
}
var text by remember { mutableStateOf("") }
TextField(
value = text,
onValueChange = { text = it },
modifier = Modifier
.focusRequester(focusRequester)
.onFocusChanged {
isFocused = it.isFocused
}
)
然而,这个解决方案似乎不起作用,因为当 TextField
进入组合时,onFocusChanged
立即被调用并将 isFocused
更新为 false
,在 LaunchedEffect
有机会处理前一个值之前。
因此,可以使用另一个变量来存储从 isFocused
中获取的值,然后再更新。下面我将其命名为 wasFocused
:
val focusRequester = remember { FocusRequester() }
var isFocused by rememberSaveable { mutableStateOf(false) }
val wasFocused = remember { isFocused }
LaunchedEffect(true) {
if (wasFocused) {
focusRequester.requestFocus()
}
}
var text by remember { mutableStateOf("") }
TextField(
value = text,
onValueChange = { text = it },
modifier = Modifier
.focusRequester(focusRequester)
.onFocusChanged {
isFocused = it.isFocused
}
)
在我的 Android 模拟器上旋转设备后,这个方法可以正常工作。如果在您的设备上无法恢复焦点,请告诉我。
(需要说明的是,这个解决方案适用于简单情况。如果在更复杂的情况下使用,例如在像 LazyColumn
中有许多 TextField
的情况下,可能会出现问题。我有这样的情况,并将其作为我的解决方案的一部分使用)。
remember
的作用,对吗? - Richard Onslow RoperhasFocus
在旋转之前被重置。旋转后,LaunchedEffect
块什么也没做。我不得不实现一种更复杂的方法来检测实际上有焦点的内容,并将这些信息保存在我的模型中。 - Bobrovsky