在我的 Jetpack Compose 项目中,我使用 Android 示例中的 BackPressHandler。一切都按预期工作,直到我暂停并恢复应用程序。此时 BackPressHandler 不再拦截后退按钮,导航只是默认为常规后按行为。
能够在演示项目中重新创建问题,请参阅代码示例:
https://gist.github.com/vitalnik/2a444c20cb9f370c405ee1ddb86d3e66
谢谢!
不用再用
BackPressHandler
了,自从那篇文章写完后,就加了系统BackHandler
,可以切换了。不存在这样的问题。
嗨,就像 @Philip 解释的那样使用
BackHandler
,它在启用时会劫持你的后压。
我使用的一个例子是底部工作表状态的组合 isExpanded
因此,当其真正的后压可以消除底部工作表并且本身也被禁用时,请尝试使用这种组合。
val scope = rememberCoroutineScope()
BackHandler(enabled = bottomSheetScaffoldState.bottomSheetState.isExpanded){
scope.launch{
bottomSheetScaffoldState.bottomSheetState.collapse()
}
}
首先,你应该使用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()
}
}
}