导航组件,检查后堆栈中是否存在碎片



使用导航组件时,如何检查后堆栈中是否存在片段?

我能想到的一件事是尝试使用获得NavBackStackEntry

val backStackEntry=findNavController().getBackStackEntry(R.id.courseTrackFeedbackFragment)

在文档中,它说如果目的地不在后堆栈上,这将引发IllegalArgumentException。但这看起来像是一个黑客,有更好的方法吗?

似乎没有其他方法,这些是我目前正在使用的扩展

fun NavController.isFragmentInBackStack(destinationId: Int) =
try {
getBackStackEntry(destinationId)
true
} catch (e: Exception) {
false
}

fun Fragment.isFragmentInBackStack(destinationId: Int) =
try {
findNavController().getBackStackEntry(destinationId)
true
} catch (e: Exception) {
false
}

使用

if (isFragmentInBackStack(R.id.myFragment)){
findNavController().popBackStack(R.id.myFragment,false)
} else {
val action = MyCurrentFragmentDirections.actionToMyFragment()
findNavController().navigateSafe(action)
}

是的,这似乎是今天的唯一方法

try {
getBackStackEntry(resId)
} catch (ignored: Throwable) {
}

一个简单的扩展函数:

fun NavController.isFragmentRemovedFromBackStack(destinationId: Int) =
try {
getBackStackEntry(destinationId)
false
} catch (e: Exception) {
true
}

要检查堆栈上是否存在任何碎片,或者碎片是否是第一个,我使用以下函数:

if (findNavController(R.id.nav_host).previousBackStackEntry?.id != null)
//Fragment exists in back stack
else
//No fragment exists in back stack

最新更新