IllegalStateException: Link does not have a NavController set IllegalStateException: Link does not have a NavController set android android

IllegalStateException: Link does not have a NavController set


Officially recommended solution

Currently using the FragmentContainerView is not very friendly, you have to access it from the supportFragmentManager:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragmentval navController = navHostFragment.navController

In my xml my FragmentContainerView looks like this:

<androidx.fragment.app.FragmentContainerView    android:id="@+id/nav_host_fragment"    android:name="androidx.navigation.fragment.NavHostFragment"    android:layout_width="0dp"    android:layout_height="0dp"    app:defaultNavHost="true"    app:layout_constraintBottom_toBottomOf="parent"    app:layout_constraintLeft_toLeftOf="parent"    app:layout_constraintRight_toRightOf="parent"    app:layout_constraintTop_toBottomOf="parent"    app:navGraph="@navigation/nav_graph"    />

This has been tested with androidx navigation version 2.3.0

I've removed the old answer because it has been clarified by Google devs that it is not the recommended solution anymore. Thanks @Justlearnedit, for posting a comment allowing me to update this issue.


UPDATED SOLUTION

Actually, Navigation can't find NavController in FrameLayout. So replacing <FrameLayout> with <fragment> will make it work.

Add the following inside the <fragment> tag -

android:name="androidx.navigation.fragment.NavHostFragment"

After doing the changes, the code will look similar to this -

 <fragment       android:id="@+id/fragment_container"       android:layout_width="match_parent"       android:layout_height="match_parent"       app:layout_behavior="@string/appbar_scrolling_view_behavior"       android:name="androidx.navigation.fragment.NavHostFragment"       app:navGraph="@navigation/main_navigation"       app:defaultNavHost="true"/>


I've done some research and found this Issue also on Google.So here's the official solution in Java:

NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()                .findFragmentById(R.id.nav_host_fragment);NavController navCo = navHostFragment.getNavController();

and here in kotlin:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragmentval navController = navHostFragment.navController