我正在关注这篇文章,以便让Dagger 2直接为我创建一个模块。但是我一直收到这个错误:
Error:(10, 1) error: @Component.Builder is missing setters for required modules or components: [stalker.commons.di.app.AppModule]
我一直在搜索,但是,虽然有类似的问题,但没有一个答案似乎适用于我。以下是我的实施:
@Singleton
@Component(
modules = [
(AppModule::class),
(ActivityBinding::class),
(AndroidInjectionModule::class)
]
)
interface AppComponent : AndroidInjector<App> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
@Module(
subcomponents = [
(LoginSubComponent::class),
(RegisterSubComponent::class),
(ForgotPasswordSubComponent::class),
(HomepageSubComponent::class)
]
)
class AppModule (private val application: Application){
@Provides
@Singleton
fun providesDefaultFieldValidator(): DefaultFieldValidator = DefaultFieldValidator()
}
class App : DaggerApplication() {
override fun onCreate() {
super.onCreate()
(applicationInjector() as AppComponent).inject(this)
plant(Timber.DebugTree())
}
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder()
.application(this)
.build()
}
}
知道我可能做错了什么吗?
Dagger无法创建模块,因为它没有空的默认构造函数。相反,您将其声明为class AppModule (private val application: Application)
,因此您需要手动创建模块并将其添加到组件中 - 如错误所示。
DaggerAppComponent.builder()
.application(this) // bind application to component builder
// where is the module?
.build()
虽然这会绑定应用程序,但是您不添加模块 - 并且如前所述,Dagger无法创建它,因为您声明了构造函数参数。
看起来你没有使用构造函数参数,所以只需删除它就可以了。
我想这是因为你有自定义构造函数将Application
作为参数
尝试添加
fun appModule(application: Application): Builder
到你的
@Component.Builder
interface Builder {
并在Application子类中创建组件时初始化它
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder()
.application(this)
.appModule(AppModule(this))
.build()
}