首页 > 解决方案 > 导航图中身份验证后如何清除片段?

问题描述

我正在使用导航图,其中我有两个片段(登录片段主片段),登录片段用于对用户进行身份验证,主片段正在显示数据列表。成功验证后,我可以导航到主片段但是当我点击后退按钮,应用程序既没有关闭也无法导航回登录片段。这是我的导航图代码

 <navigation xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/nav_graph"
  app:startDestination="@id/authenticationScreen">

  <fragment
    android:id="@+id/authenticationScreen"
    android:name="com.example.grocer.authentication.AuthenticationScreen"
    android:label="AuthenticationScreen" >
    <action
        android:id="@+id/action_authenticationScreen_to_mainFragment"
        app:destination="@id/mainFragment" />
  </fragment>

  <fragment
      android:id="@+id/mainFragment"
      android:name="com.example.grocer.mainscreen.MainFragment"
      android:label="MainFragment" >
      <action
        android:id="@+id/action_mainFragment_to_choiceSelectedFragmentModel"
        app:destination="@id/choiceSelectedFragmentModel" />
   </fragment>   

成功认证后,我希望用户导航到主片段。因此,如果用户单击后退按钮,应用程序将关闭,而不会导航回登录片段。这是我的登录片段代码

class AuthenticationScreen : Fragment(){

 private fun signIn() {
  val signInIntent = mGoogleSignInClient.signInIntent
  startActivityForResult(signInIntent, RC_SIGN_IN)
  }

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == RC_SIGN_IN) {
    val task = GoogleSignIn.getSignedInAccountFromIntent(data)
     try {
        val account = task.getResult(ApiException::class.java)
         firebaseAuthWithGoogle(account!!)
        } catch (e: ApiException) {
          showShortToast(e.message!!)
       }

     }
    }

 private  fun firebaseAuthWithGoogle(acct: GoogleSignInAccount) {
    val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
     mAuth.signInWithCredential(credential)
       .addOnCompleteListener{
           if(it.isSuccessful){
              updateUI()
              showShortToast("success")
          }else{
              showShortToast("failed")
          }
        }
      }


 override fun onStart() {
    super.onStart()
    if(mAuth.currentUser == null){

    }else{
      updateUI()
    }
   }

  private fun updateUI(){
    findNavController().navigate(R.id.action_authenticationScreen_to_mainFragment)
   }
  }

我应该如何解决这个问题?谁能告诉我?

标签: androidandroid-fragmentsnavigationandroid-jetpackandroid-navigation-graph

解决方案


在您的nav_graph的authenticationScreen中,将这些行添加到操作中:

app:popUpTo="@id/authenticationScreen"
app:popUpToInclusive="true"

app:popUpTo="@id/authenticationScreen"指定我们将回到这个片段

app:popUpToInclusive="true"指定这个片段将被弹出,因此应用程序将关闭,因为当我们单击后退按钮时将无处可去。

您在 nav_graph 中的 loginFragment 应如下所示:

<fragment
    android:id="@+id/authenticationScreen"
    android:name="com.example.grocer.authentication.AuthenticationScreen"
    android:label="AuthenticationScreen" >
    <action
        android:id="@+id/action_authenticationScreen_to_mainFragment"
        app:destination="@id/mainFragment" 
        app:popUpTo="@id/authenticationScreen"
        app:popUpToInclusive="true"/>
</fragment>

推荐阅读