使用导航组件时,如何检查后堆栈中是否存在片段?
我能想到的一件事是尝试使用获得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