我在 Jetpack 撰写应用程序中使用 onBackPressedDispatcher 时发现了一个错误。
这是一个演示该错误的简单示例。 想象一下该应用程序具有以下设置:
MainActivity onCreate
方法中我有以下行:
onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
通过此设置来回导航
可以正常工作。但是,如果您 将 Activity 置于 onPause 状态(例如,通过单击设备主页按钮并再次打开应用程序)Jetpack Compose 导航会以某种方式中断,并且它默认为使用 onBackPressedDispatcher 实现的 Activity 导航,而不是可组合屏幕导航。
在下面的视频中您可以看到:
https://github.com/konnovdev/NavigationBugDemo/tree/main
我尝试将onBackPressedDispatcher 订阅移动到活动内部的不同生命周期回调,但没有任何区别。请注意,在这个特定的应用程序示例中,onBackPressedDispatcher看起来多余,因为只有一个可组合的导航图具有自己的导航处理,但在我的真实应用程序中,我确实依赖于这种机制。
我在这里遗漏了什么吗?我很困惑为什么 onPause 状态会破坏导航。我无法找到解决此问题的好方法
通过共享视图模型连接片段导航控制器和主活动导航控制器以正确处理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