我通过模块架构学习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)
}
}
}
然后在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不能为 没有@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()
}
在Dependencies Graph
中,您已经提供了INetworkProvider
,因此当您需要NetworkProvider
时,意味着无法解析Dagger
。更改为此,不要忘记将构造函数MainPresenter
更改为INetworkProvider
@Provides
fun getMainPresenter(networkProvider: INetworkProvider): MainPresenter {
return MainPresenter(networkProvider)
}