我遵循这篇文章是为了让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()
}
}
知道我可能做错了吗?
答案 0 :(得分:3)
Dagger无法创建您的模块,因为它没有空的默认构造函数。相反,您将其声明为<table>
<thead>
<th>Groups Name</th>
<th>Groups Items</th>
</thead>
<tbody>
<tr *ngFor="let group of groups">
<td>{{group.name}}</td>
<td>
<ul>
<li *ngFor="let item of group.items">{{item}}</li>
</ul>
</td>
</tr>
</tbody>
</table>
,因此您需要手动创建模块并将其添加到组件中 - 如错误所示。
class AppModule (private val application: Application)
虽然这会绑定应用程序,但是你没有添加模块 - 正如前面提到的,Dagger无法创建它,因为你声明了构造函数参数。
您好像没有使用构造函数参数,所以只需将其删除即可。
答案 1 :(得分:1)
我想这是因为你的自定义构造函数以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()
}