Android dagger2,有些人认为不清楚

问题描述 投票:0回答:1

我通过模块架构学习dagger2。而且我认为,例如,这对我来说并不明确

在模块utilites中,我具有di封装

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

然后在appAppComponent程序包中,我包括了所有模块

@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不能为 没有@Provides注释方法提供。公共摘要 AppComponent接口扩展 dagger.android.AndroidInjector { ^ com.example.utilities.di.UtilsModule在以下位置注入 com.example.testmoduleapp.di.modules.MainModule.getMainPresenter(utilsModule) com.example.testmoduleapp.ui.activities.main.MainPresenter在以下位置注入 com.example.testmoduleapp.ui.activities.main.MainActivity.mainPresenter com.example.testmoduleapp.ui.activities.main.MainActivity在以下位置注入 dagger.android.AndroidInjector.inject(T)[com.example.testmoduleapp.di.AppComponent→ com.example.testmoduleapp.di.modules.ActivityBindingModule_MainActivity.MainActivitySubcomponent]

我理解,该错误是因为我没有模块巫婆返回NetworkProvider对象,但我无法理解如何从UtilsModule中获得该对象

olso my 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()
    }
android kotlin dependency-injection dagger-2
1个回答
0
投票

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

    @Provides
    fun getMainPresenter(networkProvider: INetworkProvider): MainPresenter {
        return MainPresenter(networkProvider)
    }
© www.soinside.com 2019 - 2024. All rights reserved.