Jetpack Compose 禁用返回按钮

16

我如何在Jetpack Compose中禁用后退按钮,或者不希望用户返回到之前的屏幕?

我尝试了下面的代码,但仍然可以返回到以前的屏幕。

BackHandler(enabled = false) {
       //do nothing
    }

您能验证它是否在rootView中吗? - Ranjithkumar
我正在构建一个4步屏幕流程,在用户完成第二步之后,我不想让他们返回。 - Sam
如果您正在使用Compose Navigation,此代码应放置在活动目标内。 - Phil Dukhov
我正在使用Compose Navigation,但是我不清楚你所说的“活动目标”是什么意思。 - Sam
4
我猜想你需要设置 enabled = true 才能让你的“什么也不做”的 BackHandler 起作用并捕获返回键(然后什么也不做)。 - Maciej Ciemięga
2个回答

29

您应该将enabled设置为true,以控制返回按钮。然后在您的NavHost中从当前目标调用BackHandler

NavHost(
    navController = navController,
    startDestination = startDestination
) {

    composable(
        route = "Your Destination Route"
    ) {

        BackHandler(true) {
            // Or do nothing
            Log.i("LOG_TAG", "Clicked back")
        }

        YourDestinationScreen()
    }
}

0
另一个答案通过消耗所有的后退导航事件来禁用后退导航。如果你仍然想在其他组合中处理后退导航,你可以使用以下方法:
@Composable
fun DisableBackHandler(
    isDisabled: Boolean,
    content: @Composable () -> Unit,
) {
    CompositionLocalProvider(
        values = LocalOnBackPressedDispatcherOwner.current?.let { parentDispatcherOwner ->
            arrayOf(
                LocalOnBackPressedDispatcherOwner provides if (isDisabled) {
                    DummyOnBackPressedDispatcherOwner(parentDispatcherOwner.lifecycle)
                } else {
                    parentDispatcherOwner
                },
            )
        } ?: arrayOf(),
        content = content,
    )
}

private class DummyOnBackPressedDispatcherOwner(
    override val lifecycle: Lifecycle,
) : OnBackPressedDispatcherOwner {
    override val onBackPressedDispatcher: OnBackPressedDispatcher
        get() = OnBackPressedDispatcher()
}

它只针对您的组合的一部分禁用了返回处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接