1

Hello I'm new to Dagger and I have crated a simple project to learn more about it. I have a class PermissionManager that has activity as constructor parameter

  class PermissionManager(activity: MainActivity) {

  }

and my MainFragment has a dependency on it. So I created BindingModule

@Module
interface BindingModule {

    @DaggerScope(MainActivity::class)
    @ContributesAndroidInjector(modules = [MainActivityModule::class])
    fun provideMainActivity(): MainActivity

    @FragmentScope
    @ContributesAndroidInjector(modules = [MainFragmentModule::class])
    fun provideMainFragment(): MainFragment
}

Here's my MainActivityModule that provides PermissionManager

@Module
abstract class MainActivityModule private constructor() {

    @Module
    companion object {
        @Provides
        @JvmStatic
        fun providePermissionManager(activity: MainActivity): PermissionManager = PermissionManager(activity)
    }
}

and here's my MainFragmentModule that has to use PermissionManager that was created in my MainActivityModule

@Module
abstract class MainFragmentModule private constructor() {

    @Module
    companion object {

        @JvmStatic
        @Provides
        @IntoMap
        @ViewModelKey(MyTestViewModel::class)
        fun provideModelFactory(
            permissionManager: PermissionManager
        ): ViewModel = MyTestViewModel(permissionManager)
    }
}

and here's what I get

com\nav\component\di\AppComponent.java:12: error: [Dagger/MissingBinding] com.nav.component.utils.PermissionManager cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.nav.component.MyTestDaggerApp>

So first of all I don't understand why I can't use dependency that was created for activity in my fragment? Any ideas how to solve this?

EDIT:

Here's how Binding Module is used

@AppScope
@Component(
    modules = [
        AndroidSupportInjectionModule::class,
        AppModule::class,
        BindingModule::class,
        NetworkingModule::class
    ]
)
interface AppComponent : AndroidInjector<MyTestDaggerApp> {

    /**
     * AppComponent Builder interface. All implementation part is handled by a dagger compiler.
     */
    @Component.Factory
    interface Factory : AndroidInjector.Factory<MyTestDaggerApp>
}
mauryat
  • 1,610
  • 5
  • 29
  • 53
David
  • 3,055
  • 4
  • 30
  • 73

1 Answers1

0

Make your fragment a subcomponent of BindingModule to get bindings from it. Don't forget to make MainActivity implement HasAndroidInjector (if it doesn’t already).

@Module
interface BindingModule {

    @DaggerScope(MainActivity::class)
    @ContributesAndroidInjector(modules = [MainActivityModule::class, MainFragmentBindingModule::class])
    fun provideMainActivity(): MainActivity
}

@Module
interface MainFragmentBindingModule {

    @FragmentScope
    @ContributesAndroidInjector(modules = [MainFragmentModule::class])
    fun provideMainFragment(): MainFragment
}
mauryat
  • 1,610
  • 5
  • 29
  • 53