Why does args classes not generating for navigation graph fragments?
A

1

7

I am using navigation-components in my android project.I have enabled Gradle's type safe args plugin here is my build.gradle(app) file.

apply plugin: 'com.android.application'
apply plugin: "androidx.navigation.safeargs"
apply plugin: 'com.google.gms.google-services'


android {
   compileSdkVersion 29
   buildToolsVersion "29.0.2"

defaultConfig {
    applicationId "com.example.nibotransporti"
    minSdkVersion 21
    targetSdkVersion 29
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 }
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}
dataBinding.enabled = true
compileOptions {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
};

}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.legacy:legacy-support-core-utils:1.0.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata:2.2.0"
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.google.firebase:firebase-auth:19.3.0'
implementation 'com.google.firebase:firebase-analytics:17.2.3'
implementation 'com.google.firebase:firebase-database:19.2.1'
implementation 'com.google.firebase:firebase-firestore:21.4.1'
implementation 'com.google.android.material:material:1.1.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
implementation 'com.robertlevonyan.view:CustomFloatingActionButton:3.0.0'
implementation 'com.shuhart.stepview:stepview:1.5.1'
implementation 'com.alespero:expandable-cardview:0.8'
implementation 'com.anton46:stepsview:0.0.2'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.google.guava:guava:27.0.1-android'
implementation 'com.kofigyan.stateprogressbar:stateprogressbar:1.0.0'
implementation 'androidx.navigation:navigation-fragment:2.2.1'
implementation 'androidx.navigation:navigation-ui:2.2.1'
implementation "androidx.fragment:fragment:1.3.0-alpha01"

}

and my build.gradle(project) file.

buildscript {
repositories {
    google()
    jcenter()
    maven { url "https://jitpack.io" }

}
dependencies {
    classpath 'com.android.tools.build:gradle:3.6.1'
    classpath 'com.google.gms:google-services:4.3.3'
    def nav_version = "2.3.0-alpha03"
    classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"


    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
   }
 }

allprojects {
  repositories {
    google()
    jcenter()
    maven { url "https://jitpack.io" }

  }
 }

 task clean(type: Delete) {
   delete rootProject.buildDir
 }

My navigation graph xml code is here as.

<?xml version="1.0" encoding="utf-8"?> <br/>
<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/signInFragment">

<fragment
    android:id="@+id/signInFragment"
    android:name="com.example.nibotransporti.Fragment.SignInFragment"
    android:label="fragment_sign_in"
    tools:layout="@layout/fragment_sign_in" >
    <action
        android:id="@+id/action_registration"
        app:destination="@id/signUpFragment">
        <argument
            android:name="email"
            android:defaultValue="3"
            app:argType="string" />
    </action>
    <action
        android:id="@+id/action_signInFragment_to_workerAnalyticsFragment"
        app:destination="@id/workerAnalyticsFragment" />
</fragment>

<fragment
    android:id="@+id/signUpFragment"
    android:name="com.example.nibotransporti.Fragment.SignUpFragment"
    android:label="fragment_sign_up"
    tools:layout="@layout/fragment_sign_up">

    <action
        android:id="@+id/action_signUpFragment_to_signInFragment"
        app:destination="@id/signInFragment">
        <argument
            android:name="email"
            android:defaultValue="ten"
            app:argType="string" />
        <argument
            android:name="password"
            android:defaultValue="wen"
            app:argType="string" />

    </action>
</fragment>


<fragment
    android:id="@+id/workerAnalyticsFragment"
    android:name="com.example.nibotransporti.Fragment.WorkerAnalyticsFragment"
    android:label="WorkerAnalyticsFragment"
    tools:layout="@layout/fragment_woker_analytics"/>
<fragment
    android:id="@+id/reportFragment"
    android:name="com.example.nibotransporti.Fragment.ReportFragment"
    android:label="fragment_stock"
    tools:layout="@layout/fragment_stock" />

</navigation>

Even after several attempts of building the project,the args class for the destination fragment are not creating.
Here is my code of the fragment in which the action is originating (SignUpFragment)

SignUpFragmentDirections.ActionSignUpFragmentToSignInFragment action =
                            SignUpFragmentDirections.actionSignUpFragmentToSignInFragment();
                    action.setEmail(email);
                    action.setPassword(password);

And here is the destination code of the fragment (SignInFragment) where i want to access those args . email & password.

SignInFragmentArgs.getArguments().getString()
                                    //Set up the navigation for the appropriate action
                                    Navigation.findNavController(v).navigate(action);

According to the official documentation the SignInFragmentArgs code should be generated during building the project but it is not and i am in a serious trouble because i want to access those passed arguments email and password from SignUpFragment but i cannot find SignInFragmentArgs class which means that it is not generated during building.
Anyone here please i need the solution.

Ambriz answered 16/3, 2020 at 19:52 Comment(1)
Note that as per the Principles of Navigation and the User Login Conditional Navigation guide, you absolutely shouldn't be using log in / registration as the start destination of your graph.Margaretemargaretha
M
10

Your <argument> elements need to be on the <fragment> classes, not on the <action> elements - arguments on actions only provide override values for the arguments already on the destination they point to.

<?xml version="1.0" encoding="utf-8"?>
<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/signInFragment">

    <fragment
      android:id="@+id/signInFragment"
      android:name="com.example.nibotransporti.Fragment.SignInFragment"
      android:label="fragment_sign_in"
      tools:layout="@layout/fragment_sign_in" >
        <argument
          android:name="email"
          android:defaultValue="ten"
          app:argType="string" />
        <argument
          android:name="password"
          android:defaultValue="wen"
          app:argType="string" />
        <action
          android:id="@+id/action_registration"
          app:destination="@id/signUpFragment" />
        <action
          android:id="@+id/action_signInFragment_to_workerAnalyticsFragment"
          app:destination="@id/workerAnalyticsFragment" />
    </fragment>

    <fragment
      android:id="@+id/signUpFragment"
      android:name="com.example.nibotransporti.Fragment.SignUpFragment"
      android:label="fragment_sign_up"
      tools:layout="@layout/fragment_sign_up">
        <argument
          android:name="email"
          android:defaultValue="3"
          app:argType="string" />

        <action
          android:id="@+id/action_signUpFragment_to_signInFragment"
          app:destination="@id/signInFragment" />
    </fragment>

    <fragment
      android:id="@+id/workerAnalyticsFragment"
      android:name="com.example.nibotransporti.Fragment.WorkerAnalyticsFragment"
      android:label="WorkerAnalyticsFragment"
      tools:layout="@layout/fragment_woker_analytics"/>
    <fragment
      android:id="@+id/reportFragment"
      android:name="com.example.nibotransporti.Fragment.ReportFragment"
      android:label="fragment_stock"
      tools:layout="@layout/fragment_stock" />
</navigation>
Margaretemargaretha answered 17/3, 2020 at 4:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.