I have an activity with the navigation drawer and a lot of fragments in it. I use Navigation library from the Architecture Components. In every fragment I have to write navController = Navigation.findNavController(activity!!, R.id.fragment_container)
. I want to get rid of this boilerplate code. So I decide to inject it with Dagger.
@Module
class MainActivityModule {
@ActivityScope
@Provides
fun provideNavController(activity: MainActivity): NavController {
return Navigation.findNavController(activity, R.id.fragment_container)
}
}
@Suppress("unused")
@Module
abstract class ActivityBuildersModule {
@ActivityScope
@ContributesAndroidInjector(
modules = [MainActivityModule::class, MainActivityFragmentBuildersModule::class])
abstract fun contributeMainActivity(): MainActivity
}
Injection into fragments works fine, but when I try to inject into activity application crashes:
09-19 19:22:37.152 22342-22342/com.dmitrysimakov.gymlab
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.dmitrysimakov.gymlab, PID: 22342
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.dmitrysimakov.gymlab/com.dmitrysimakov.gymlab.MainActivity}:
java.lang.IllegalArgumentException: ID does not reference a View inside this Activity
.....
So I have to duplicate navController = Navigation.findNavController(activity!!, R.id.fragment_container)
in the activity. Is there a more elegant way to do this?