[英]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.