如何在 Jetpack Compose 中重写系统 onbackpress()

Ran*_*mar 54 android android-jetpack-compose

问题:

在我的撰写页面 - >我有元素列表,如果我按任何人,我将在同一页面中显示子内容(隐藏主要内容并显示子内容)

如果我按顶部栏中的后退按钮,我会按照自己的逻辑处理自己。

但我无法处理系统后压。

问题 :

有什么方法可以覆盖 Jetpack Compose 中的 onBackPressed() 吗?

我的代码:

 @Composable
private fun AnimationRootView() {

 //Main content list
 Column(){

 }

 //Sub content list
 Column(){

 if(detail1Clicked)
   Detail1()
if(detail2Clicked)
   Detail2()
 }
 ....
 ....
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*hov 139

您可以使用BackHandler

@Composable
fun TestScreen() {
    BackHandler {
        // your action
    }
}
Run Code Online (Sandbox Code Playgroud)

为了获得与调用相同的效果super.onBackPressed(),最组合的方式是enabled根据您的状态使用参数:

BackHandler(
    // your condition to enable handler
    enabled = isOverlayPresented
) {
    // your action to be called if back handler is enabled
    isOverlayPresented = false
}
Run Code Online (Sandbox Code Playgroud)

如果您需要同时处理后按操作并执行默认后退操作,则可以使用LocalOnBackPressedDispatcherOwner。由于BackHandler也在幕后使用它,您需要等待下一次重组以确保您的后台处理程序被禁用,然后您可以执行onBackPressed

val onBackPressedDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher
var backPressHandled by remember { mutableStateOf(false) }
val coroutineScope = rememberCoroutineScope()
BackHandler(enabled = !backPressHandled) {
    println("back pressed")
    backPressHandled = true
    coroutineScope.launch {
        awaitFrame()
        onBackPressedDispatcher?.onBackPressed()
        backPressHandled = false
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我想在第二次后按后关闭屏幕,那么“super.onBackPressed()”触发通常的后按行为的替代方法是什么? (16认同)
  • @SpiralDev您可以传递`BackHandler(enabled =enabled)`参数,您可以根据您的状态确定该参数。 (7认同)