我正在尝试在 compose 中重新创建 SearchView,但我遇到了焦点问题。
我添加了一个返回处理程序以在按下后关闭搜索视图。
当您单击搜索图标时,它会打开我的搜索视图并获得焦点,以便您可以开始输入,但是需要按 3 次后退键来关闭视图,而不是按 2 次p>
1:关闭键盘(预期)
2:清除焦点(意外)
3:触发我的后台处理程序并关闭视图(预期)
焦点清除本身在失去焦点时明显吃掉了后面的听众,但我看不到如何清除堆栈所以它不需要额外的按下?它不会进入监听器,直到它吃掉 1 次按下。
在下面的示例中,它需要 2 而不是 1,因为键盘不会自动弹出。它首先移除焦点,然后停止显示视图。
@Composable
fun test() {
val isShowing = remember { mutableStateOf(true) }
if (isShowing.value) {
val focusRequester = FocusRequester()
TextField(
value = "Hello World",
onValueChange = {},
modifier = Modifier.focusRequester(focusRequester),
textStyle = TextStyle(Color.White),
)
DisposableEffect(Unit) {
focusRequester.requestFocus()
onDispose {}
}
TestBackHandler(true) {
isShowing.value = false
}
}
}
@Composable
public fun TestBackHandler(enabled: Boolean = true, onBack: () -> Unit) {
val currentOnBack by rememberUpdatedState(onBack)
val backCallback = remember {
object : OnBackPressedCallback(enabled) {
override fun handleOnBackPressed() {
currentOnBack()
}
}
}
SideEffect {
backCallback.isEnabled = enabled
}
val backDispatcher = checkNotNull(LocalOnBackPressedDispatcherOwner.current) {
"No OnBackPressedDispatcherOwner was provided via LocalOnBackPressedDispatcherOwner"
}.onBackPressedDispatcher
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifecycleOwner, backDispatcher) {
backDispatcher.addCallback(lifecycleOwner, backCallback)
onDispose {
backCallback.remove()
}
}
}
我如何阻止需要额外的新闻,这在非写作世界中是没有的?