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

时间:2019-03-17 17:44:05

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

今天,我开始使用Android的导航组件来在我的应用程序中实现身份验证流程。这个想法很简单:用户启动应用程序,如果通过身份验证,则显示一个用户界面,如果未通过身份验证,则显示另一个用户界面。

我所做的是在我的HomeFragment的{​​{1}}方法中,我检查用户是否通过了身份验证,如果没有通过身份验证,我将其称为onViewCreated的{​​{1}}方法,方法是向其传递将导航至NavController的操作的ID。一切正常,直到用户在navigate()中单击后退按钮为止,因为这样我得到this error。我仍然不知道该错误的真正原因是什么,但是导航发生得太快的想法似乎与我的情况类似:目的地首先从AuthenticationFragment切换到AuthenticationFragment,然后立即从{{1 }}再次AuthenticationFragment,因为HomeFragment再次发现用户未通过身份验证。

尽管我遇到了错误,但这种方法对我来说似乎仍然是错误的。在进行身份验证之前,用户不应返回到HomeFragment(并且在片段立即来回切换时看到屏幕闪烁)。我也看过这个Android's official guide to implementing an authentication flow,但对我来说似乎也错了,因为在那里涉及了冗余的第三部分UI(AuthenticationFragment)。在我的情况下,我可以将其替换为启动屏幕,但它仍保留在后堆栈中,并且用户可以返回到启动屏幕,这显然是胡说八道。

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

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

1 个答案:

答案 0 :(得分:0)

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

  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>