FocusRequestor 正在吃后退动作迫使需要额外的后退动作

时间:2021-07-11 20:33:55

标签: android-jetpack-compose

我正在尝试在 compose 中重新创建 SearchView,但我遇到了焦点问题。

我添加了一个返回处理程序以在按下后关闭搜索视图。

当您单击搜索图标时,它会打开我的搜索视图并获得焦点,以便您可以开始输入,但是需要按 3 次后退键来关闭视图,而不是按 2 次

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()
        }
    }
}

我如何阻止需要额外的新闻,这在非写作世界中是没有的?

0 个答案:

没有答案