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

问题描述 投票:0回答: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()
    }

}

知道我可能做错了什么吗?

android dagger-2
2个回答
3
投票

Dagger无法创建模块,因为它没有空的默认构造函数。相反,您将其声明为class AppModule (private val application: Application),因此您需要手动创建模块并将其添加到组件中 - 如错误所示。

DaggerAppComponent.builder()
            .application(this) // bind application to component builder
                // where is the module?
            .build()

虽然这会绑定应用程序,但是您不添加模块 - 并且如前所述,Dagger无法创建它,因为您声明了构造函数参数。

看起来你没有使用构造函数参数,所以只需删除它就可以了。


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()
}
© www.soinside.com 2019 - 2024. All rights reserved.