Jetpack Compose BackPressHandler 无法拦截 onResume 后的后按操作

问题描述 投票:0回答:3

在我的 Jetpack Compose 项目中,我使用 Android 示例中的 BackPressHandler。一切都按预期工作,直到我暂停并恢复应用程序。此时 BackPressHandler 不再拦截后退按钮,导航只是默认为常规后按行为。

能够在演示项目中重新创建问题,请参阅代码示例:

https://gist.github.com/vitalnik/2a444c20cb9f370c405ee1ddb86d3e66

谢谢!

android android-jetpack-compose onbackpressed android-jetpack-navigation
3个回答
6
投票

不用再用

BackPressHandler
了,自从那篇文章写完后,就加了系统
BackHandler
,可以切换了。不存在这样的问题。


2
投票

嗨,就像 @Philip 解释的那样使用

BackHandler
,它在启用时会劫持你的后压。 我使用的一个例子是底部工作表状态的组合
isExpanded
因此,当其真正的后压可以消除底部工作表并且本身也被禁用时,请尝试使用这种组合。

val scope = rememberCoroutineScope()
BackHandler(enabled = bottomSheetScaffoldState.bottomSheetState.isExpanded){
  scope.launch{
     bottomSheetScaffoldState.bottomSheetState.collapse()
   }
}

0
投票

首先,你应该使用BackHandler代替BackPressHandler,但这并不能直接解决问题。您可以通过下面的链接检查问题以及导致问题的原因。

https://issuetracker.google.com/issues/279118447

解决方案1

此问题已在导航 (androidx.navigation:navigation-compose) 版本 2.7.0-beta01 中修复。如果您的版本低于2.7.0-beta01,则必须将版本更新到2.7.0-beta01或更高版本。

解决方案2

您可以使用下面的可组合项来解决该问题。

@Composable
fun BackHandlerWithLifecycle(
    enabled: Boolean = true,
    onBack: () -> Unit
) {
    var refreshBackHandler by rememberSaveable { mutableStateOf(false) }
    OnLifecycleEvent { _, event ->
        when (event) {
            Lifecycle.Event.ON_PAUSE -> refreshBackHandler = false
            Lifecycle.Event.ON_RESUME -> refreshBackHandler = true
            else -> Unit
        }
    }
    if (refreshBackHandler) {
        BackHandler(enabled = enabled) {
            onBack()
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.