首页 > 解决方案 > 使用 Android 导航组件的身份验证流程

问题描述

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

我所做的是在我HomeFragment的 'onViewCreated方法中检查用户是否经过身份验证,如果她不是,我NavController通过navigate()将导航到AuthenticationFragment. 一切正常,直到用户在其中单击后退按钮AuthenticationFragment,因为那时我收到此错误。我仍然不知道该错误的实际原因是什么,但是导航发生得太快的想法似乎与我的情况相似:目的地首先从AuthenticationFragmentto切换HomeFragment,然后立即从HomeFragmenttoAuthenticationFragment再次切换,因为HomeFragment再次发现用户未通过身份验证.

尽管我遇到了错误,但这种方法对我来说仍然是错误的。在她进行身份验证之前,用户不应该能够返回到HomeFragment(并在片段立即来回切换时看到屏幕闪烁)。我还查看了这个Android 的实现身份验证流程的官方指南,但对我来说这似乎也是错误的,因为那里涉及到冗余的第三部分 UI(the MainFragment)。在我的情况下,我可以用闪屏替换它,但它仍会留在后台堆栈中,用户将能够返回到闪屏,这显然是无稽之谈。

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

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

标签: androidauthenticationandroid-jetpackandroid-architecture-navigation

解决方案


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

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

    <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>


推荐阅读