Android dagger2 , 有些事情不清楚

Android dagger2 , some things not clear

我正在学习模块架构的 dagger2。我想,有些事情我不清楚,例如

在模块utilites中我有di

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)
        }
    }
}

然后在 AppComponent 中的 app 包中,我包含了所有模块

@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]

我知道错误是因为我没有模块 return 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()
    }

Dependencies Graph中你已经提供了INetworkProvider所以当你需要NetworkProvider时就意味着Dagger无法解析。更改为这个,不要忘记将构造函数 MainPresenter 更改为 INetworkProvider

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

but i cant understand how i can get this object from UtilsModule

对于您的问题,在 UtilComponent 中您已经暴露了 getNetworkProvider() 这意味着可以获取对 UtilsComponent 的任何 Componenent 依赖项。