Dagger2无法为应用程序对象提供BindsInstance

时间:2017-12-19 16:14:45

标签: android dagger-2

我遵循这篇文章是为了让Dagger 2直接为我创建一个模块。但是我一直收到这个错误:

Error:(10, 1) error: @Component.Builder is missing setters for required modules or components: [stalker.commons.di.app.AppModule]

我一直在搜索,但是,虽然有类似的问题,但似乎没有一个答案适用于我。以下是我的实施:

AppComponent.kt

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

}

AppModule.kt

@Module(
        subcomponents = [
            (LoginSubComponent::class),
            (RegisterSubComponent::class),
            (ForgotPasswordSubComponent::class),
            (HomepageSubComponent::class)
        ]
)
class AppModule (private val application: Application){

    @Provides
    @Singleton
    fun providesDefaultFieldValidator(): DefaultFieldValidator = DefaultFieldValidator()

}

App.kt

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

}

知道我可能做错了吗?

2 个答案:

答案 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()
}