简体   繁体   English

Dagger-Android:缺少模块的setter

[英]Dagger-Android: Missing setters for modules

DataModule: DataModule中:

@Module
class DataModule constructor(application: App){

    private var db : Database = Room.databaseBuilder(application.applicationContext,
            Database::class.java, "database.db")
            .build()

    @Provides
    @PerApplication
    fun provideDatabase(): Database {
        return db
    }

App: 应用程序:

class App : DaggerApplication() {

    @Inject lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()
        setupTimber()
       // setupCrashlytics()
        RxPaparazzo.register(this)
    }

    override fun applicationInjector(): AndroidInjector<out App> {
        return DaggerApplicationComponent.builder()
                .dataModule(DataModule(this)).create(this)
    }

ApplicationComponent: ApplicationComponent:

@PerApplication
@Component(modules = [AndroidSupportInjectionModule::class, ActivityBindingModule::class, ApplicationModule::class, DataModule::class, ServiceModule::class])
interface ApplicationComponent : AndroidInjector<App> {
    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<App>()

}

I get error: 我收到错误:

Error:(21, 2) error: @Component.Builder is missing setters for required modules or components: [com.org.injection.module.DataModule]
    public static abstract class Builder extends dagger.android.AndroidInjector.Builder<com.org.App> {
                       ^

That happens, because you have declared, that DataModule needs an instance of application object in order to be constructed, but you have not specified how to create that module. 发生这种情况,因为您已声明, DataModule需要一个应用程序对象的实例才能构造,但您尚未指定如何创建该模块。 If a @Module annotated class has not any parameters in its constructor (ie has a default constructor), then dagger will take of creating the module. 如果@Module注释的类在其构造函数中没有任何参数(即具有默认构造函数),则dagger将创建该模块。 Otherwise, you have to specify how to create the module manually. 否则,您必须指定如何手动创建模块。

Change the topmost (application) component to following: 将最顶层(应用程序)组件更改为以下内容:


    @Component(modules = [...])
    interface AppComponent {
      @Component.Builder
      interface Builder {
        // @BindsInstance will make `application` to be accessible in the graph
        @BindsInstance
        fun application(application: Application): Builder
        fun build(): AppComponent
      }
    }

Now change DataModule to ask for an instance of application object: 现在更改DataModule以请求应用程序对象的实例:


    @Module
    class DataModule {
      @Provides
      fun provideDatabase(application: Application): Database {
        return ...
      }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM