android - 使用 Android 导航组件的身份验证流程

标签 android authentication android-jetpack android-architecture-navigation

今天我开始尝试使用 Android 的导航组件在我的应用程序中实现身份验证流程。这个想法非常简单:用户启动应用程序,如果她通过了身份验证,它会显示一个 UI,如果她没有通过身份验证,则显示另一个 UI。

我所做的是在我的 HomeFragmentonViewCreated 方法中,我检查用户是否已通过身份验证,如果没有,我将调用 NavControllernavigate() 方法,方法是向它传递将导航到 AuthenticationFragment 的操作的 ID。一切正常,直到用户在 AuthenticationFragment 中单击后退按钮,因为那时我得到 this error .我仍然不知道该错误的真正原因是什么,但导航发生得太快的想法似乎与我的情况相似:目的地首先从 AuthenticationFragment 切换到 HomeFragment 并且然后立即从 HomeFragmentAuthenticationFragment 再次,因为 HomeFragment 再次发现用户未通过身份验证。

尽管我遇到了错误,但这种方法对我来说仍然是错误的。在进行身份验证之前,用户不应该能够返回到 HomeFragment(并在 fragment 立即来回切换时看到屏幕闪烁)。我也看过这个 Android's official guide to implementing an authentication flow ,但这对我来说似乎也是错误的,因为那里涉及到多余的第三 block UI(MainFragment)。在我的例子中,我可以用启动画面替换它,但它仍会留在后台堆栈中,用户将能够返回到启动画面,这显然是无稽之谈。

那么使用 Android 的新导航组件实现身份验证流程的正确方法是什么?我想要的功能是:如果用户未通过身份验证,那么她将被重定向到身份验证 UI,如果她从那里按下后退按钮,她应该退出应用程序。

更新:我知道我可以只听后退事件并从那里关闭应用程序,但我仍然希望有一些使用 Android 导航组件的优雅解决方案。

最佳答案

在您的登录 fragment 中,您需要从主页 fragment 声明“弹出”操作。

  1. 这会从返回堆栈中弹出所有不匹配的目的地,直到 找到了这个目的地。
  2. "popUpToInclusive = true"从后台弹出给定的目的地

    <fragment android:id="@+id/loginFragment" android:name="com.example.navigationsample.fragments.Login" android:label="Login_Fragment" tools:layout="@layout/layout_login"> <action android:id="@+id/action_loginFragment_to_homeFragment" app:destination="@id/homeFragment" app:popUpTo="@id/loginFragment" app:popUpToInclusive="true"/> </fragment>

关于android - 使用 Android 导航组件的身份验证流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55210030/

相关文章:

jquery - 通过 Ajax 调用使用 http 基本身份验证

Android 导航组件在 Activity 旋转时保留当前 Fragment

java - 调用 onChildChanged() 方法时将 firebase 子节点移动到顶部

java - Spring Boot 中的复杂身份验证

android - 形状识别

sharepoint - 仅保护站点的 Login.aspx

AndroidX JetPack NavigationUI - 覆盖抽屉中非导航项目的操作

android - 在模块中找到重复的类 com.google.android.a.a?

android - Retrofit response : Cache Control. 是什么意思?

android - 在android studio中运行项目时出现内存不足错误