onBackPressedDispatcher 破坏了 Jetpack Compose 导航

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

我在 Jetpack 撰写应用程序中使用 onBackPressedDispatcher 时发现了一个错误。

这是一个演示该错误的简单示例。 想象一下该应用程序具有以下设置:

  • 它有一个 MainActivity,里面有 MainFragment
  • MainFragment 包含在 Jetpack Compose 中实现的 NavGraph
  • 导航图有 3 个可组合屏幕

MainActivity onCreate

 方法中我有以下行:

onBackPressedDispatcher.addCallback(this, onBackPressedCallback)


用于应用程序范围的后台堆栈的自定义处理

通过此设置来回导航

可以正常工作。但是,如果您 将 Activity 置于 onPause 状态(例如,通过单击设备主页按钮并再次打开应用程序)Jetpack Compose 导航会以某种方式中断,并且它默认为使用 onBackPressedDispatcher 实现的 Activity 导航,而不是可组合屏幕导航。

在下面的视频中您可以看到:

    我可以正确地前后导航
  1. 一旦我单击主页按钮并再次打开应用程序,导航就会中断。我已经回不去了

我已经在 GitHub 上发布了这个演示项目,所以你可以自己查看:

https://github.com/konnovdev/NavigationBugDemo/tree/main

我尝试将

onBackPressedDispatcher 订阅移动到活动内部的不同生命周期回调,但没有任何区别。请注意,在这个特定的应用程序示例中,onBackPressedDispatcher看起来多余,因为只有一个可组合的导航图具有自己的导航处理,但在我的真实应用程序中,我确实依赖于这种机制。

我在这里遗漏了什么吗?我很困惑为什么 onPause 状态会破坏导航。我无法找到解决此问题的好方法

android android-jetpack-compose android-navigation android-navigation-graph jetpack-compose-navigation
1个回答
0
投票
修复

通过共享视图模型连接片段导航控制器和主活动导航控制器以正确处理OnBackPressed。

https://github.com/konnovdev/NavigationBugDemo/pull/1/commits/971e0ec5b5d9589f54bc78559bbe62eaf3d0eede

private val onBackPressedCallback: OnBackPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { if (!navController.navigateUp()) { println("No more back navigation, can exit app or do any other task") finish() // Close the app or replace with custom back press handling } }
在 oncreate 中

sharedViewModel.navController.observe(this) { controller -> navController = controller // Setup back press callback with NavController onBackPressedDispatcher.addCallback(this, onBackPressedCallback) }
视图模型

class SharedViewModel : ViewModel() { private val _navController = MutableLiveData<NavController>() val navController: LiveData<NavController> = _navController fun setNavController(controller: NavController) { _navController.value = controller } }
在片段中,setNavController

NavigationBugDemoTheme { val navController = rememberNavController() sharedViewModel.setNavController(navController) //rest of the code
    
© www.soinside.com 2019 - 2024. All rights reserved.