gpt4 book ai didi

android - 检查导航图是否在 backstack 上

转载 作者:行者123 更新时间:2023-12-03 23:41:21 26 4
gpt4 key购买 nike

我的导航图有 auth包含 LoginFragment 和 SignUpFragment 的子图:

<navigation
android:id="@+id/auth"
app:startDestination="@id/loginFragment">
<fragment
android:id="@+id/signUpFragment"
[...]
<fragment
android:id="@+id/loginFragment"
[...]
</fragment>
[...]
</navigation>
我想检查这两个目的地中的任何一个当前是否在后台。但不是单独检查每个目的地,如下所示:
val currentDestId = navController.currentDestination?.id
if (currentDestId != R.id.loginFragment && currentDestId != R.id.signUpFragment) {
navController.navigate(
NavGraphDirections.actionGlobalLogin()
)
}
我认为只检查身份验证图当前是否在后堆栈上会更干净。
我目前的方法如下:
val authBackStack = try {
navController.getBackStackEntry(R.id.auth)
} catch (t: Throwable) {
null
}
if (authBackStack == null) {
navController.navigate(
NavGraphDirections.actionGlobalLogin()
)
}
这里的想法是 getBackStackEntry抛出 IllegalStateException如果传递的目的地(或本例中的图形)当前不在后堆栈上。我们使用这个异常作为一个指标来确定我们的图当前是否在后栈中。
这是一种有效的方法还是会在某些情况下中断?或者也许有更好的方法来检查后堆栈是否包含某个子图的目的地?

最佳答案

这是正确的方法,但您可以将其隐藏为扩展函数,如下所示:

fun NavController.isOnBackStack(@IdRes id: Int): Boolean = try { getBackStackEntry(id); true } catch(e: Throwable) { false }
这样你实际上得到了你想要的 bool 值,同时隐藏了基于异常的控制流(这是由于 Jetpack Navigation 公开的 API 的要求)。

关于android - 检查导航图是否在 backstack 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65529172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com