Android dagger2, кое-что не понятно - PullRequest
0 голосов
/ 17 июня 2020

Я изучаю dagger2 с модульной архитектурой. И я думаю, что-то мне непонятно например

в модуле utilites у меня di package

class UtilsComponent

@Component(modules = [UtilsModule::class])
interface UtilsComponent {

    fun getResourceProvider() : IResourceProvider
    fun getNetworkProvider(): INetworkProvider

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): UtilsComponent.Builder
        fun build(): UtilsComponent
    }
}

@Module
abstract class UtilsModule {

    @Binds
    abstract fun bindContext(application: Application): Context

    @Module
    companion object {
        @Provides
        @JvmStatic
        fun bindResourceProvider(context: Context): IResourceProvider {
            return ResourceProvider(context = context)
        }

        @Provides
        @JvmStatic
        fun bindNetworkProvider(context: Context): INetworkProvider {
            return NetworkProvider(context = context)
        }
    }
}

то в app пакете в AppComponent я включил все модули

@Component(
            dependencies = [UtilsComponent::class],
            modules = [
                    AndroidInjectionModule::class,
                    ActivityBindingModule::class,
                    MainModule::class // test module
            ]
)

@AppScope
interface AppComponent: AndroidInjector<App> {
    // inject to ...
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): AppComponent.Builder

        fun utilsComponent(utilsComponent: UtilsComponent): AppComponent.Builder

        fun build(): AppComponent
    }

}

В компоненте приложения у меня есть MainModule - это мой тестовый модуль, поэтому этот модуль выглядит так

@Module
class MainModule {

    @Provides
    fun getMainPresenter(networkProvider: NetworkProvider): MainPresenter {
        return MainPresenter(networkProvider)
    }

}

когда я запускаю приложение, у меня появляется ошибка

 [Dagger/MissingBinding] com.example.utilities.di.UtilsModule cannot be
 provided without an @Provides-annotated method. public abstract
 interface AppComponent extends
 dagger.android.AndroidInjector<com.example.testmoduleapp.App> {
                 ^
       com.example.utilities.di.UtilsModule is injected at
           com.example.testmoduleapp.di.modules.MainModule.getMainPresenter(utilsModule)
       com.example.testmoduleapp.ui.activities.main.MainPresenter is injected at
           com.example.testmoduleapp.ui.activities.main.MainActivity.mainPresenter
       com.example.testmoduleapp.ui.activities.main.MainActivity is injected at
           dagger.android.AndroidInjector.inject(T) [com.example.testmoduleapp.di.AppComponent →
 com.example.testmoduleapp.di.modules.ActivityBindingModule_MainActivity.MainActivitySubcomponent]

Я понимаю, что ошибка связана с тем, что у меня нет модуля, возвращающего объект NetworkProvider, но я не могу понять, как я могу получить этот объект из UtilsModule

также из App

@Inject
    lateinit var androidInjector : DispatchingAndroidInjector<Any>
    override fun androidInjector(): AndroidInjector<Any> = androidInjector

    companion object{
        lateinit var appComponent: AppComponent
    }

    override fun onCreate() {
        super.onCreate()
        initializeDagger()
    }

    private fun initializeDagger() {
        appComponent = DaggerAppComponent
            .builder()
            .application(this)
            .utilsComponent(provideUtilsComponent())
            .build()
    }

    private fun provideUtilsComponent(): UtilsComponent {
        return DaggerUtilsComponent
            .builder()
            .application(this)
            .build()
    }

1 Ответ

0 голосов
/ 17 июня 2020

В Dependencies Graph Вы уже указали INetworkProvider, поэтому, когда вам нужно NetworkProvider, это означает, что Dagger не может быть разрешен. Измените это, не забудьте изменить конструктор MainPresenter на INetworkProvider

    @Provides
    fun getMainPresenter(networkProvider: INetworkProvider): MainPresenter {
        return MainPresenter(networkProvider)
    }

, но я не могу понять, как я могу получить этот объект из UtilsModule

На ваш вопрос: в UtilComponent вы уже выставили getNetworkProvider(), это означает, что любые Componenent зависимости от UtilsComponent могут быть получены.

...