[英]Dagger 2 A binding with matching key exists in component
I've seen that this is a problem that has already been asked around here, but I can't seem to solve it in my code after going around several times.我已经看到这是一个已经在这里被问到的问题,但是在我的代码中经过几次之后似乎无法解决它。 I am trying to implement Room with Dagger 2 in my application, I have created the necessary Module where I create the references to the database and the Dao class.
我正在尝试在我的应用程序中实现 Room with Dagger 2,我已经创建了必要的模块,我在其中创建了对数据库和 Dao 类的引用。
The problem is when I compile my project, which gives me this error and I have tried many things and I can not solve it, I pass part of the code to see if you can help me:问题是当我编译我的项目时,这给了我这个错误,我尝试了很多东西都无法解决它,我传递了部分代码,看看您是否可以帮助我:
My class AppComponent:我的类 AppComponent:
@Singleton
@Component(
modules = [
AndroidInjectionModule::class,
AppModule::class,
LoginModule::class,
LoginBuilder::class,
DatabaseModule::class,
DashboardBuilder::class,
ActivityBuilder::class,
HomeBuilder::class,
HomeModule::class,
ContactBuilder::class
]
)
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
fun inject(app: App)
}
My AppComponent autogenerate for Dagger 2:我的 AppComponent 为 Dagger 2 自动生成:
@kotlin.Metadata(mv = {1, 1, 16}, bv = {1, 0, 3}, k = 1, d1 = {"\u0000\u0018\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\bg\u0018\u00002\u00020\u0001:\u0001\u0006J\u0010\u0010\u0002\u001a\u00020\u00032\u0006\u0010\u0004\u001a\u00020\u0005H&\u00a8\u0006\u0007"}, d2 = {"Lcom/ludiras/ameisin/dagger/component/AppComponent;", "", "inject", "", "app", "Lcom/ludiras/ameisin
/App;", "Builder", "app_debug"})
@dagger.Component(modules = {dagger.android.AndroidInjectionModule.class, com.ludiras.ameisin.dagger.modules.AppModule.class,
com.ludiras.ameisin.dagger.modules.LoginModule.class, com.ludiras.ameisin.dagger.modules.LoginBuilder.class, com.ludiras.ameisin.dagger.modules.DatabaseModule.class, com.ludiras.ameisin.dagger.modules.DashboardBuilder.class, com.ludiras.ameisin.dagger.modules.ActivityBuilder.class, com.ludiras.ameisin.dagger.modules.HomeBuilder.class, com.ludiras.ameisin.dagger.modules.HomeModule.class, com.ludiras.ameisin.dagger.modules.ContactBuilder.class})
@javax.inject.Singleton()
public abstract interface AppComponent {
public abstract void inject(@org.jetbrains.annotations.NotNull()
com.ludiras.ameisin.App app);
@kotlin.Metadata(mv = {1, 1, 16}, bv = {1, 0, 3}, k = 1, d1 = {"\u0000\u0016\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\bg\u0018\u00002\u00020\u0001J\u0010\u0010\u0002\u001a\u00020\u00002\u0006\u0010\u0002\u001a\u00020\u0003H\'J\b\u0010\u0004\u001a\u00020\u0005H&\u00a8\u0006\u0006"}, d2 = {"Lcom/ludiras/ameisin/dagger/component/AppComponent$Builder;", "", "application", "Landroid/app/Application;", "build", "Lcom/ludiras/ameisin/dagger/component/AppComponent;", "app_debug"})
@dagger.Component.Builder()
public static abstract interface Builder {
@org.jetbrains.annotations.NotNull()
@dagger.BindsInstance()
public abstract com.ludiras.ameisin.dagger.component.AppComponent.Builder application(@org.jetbrains.annotations.NotNull()
android.app.Application application);
@org.jetbrains.annotations.NotNull()
public abstract com.ludiras.ameisin.dagger.component.AppComponent build();
}
}
My error from console:我的控制台错误:
AppComponent.java:8: error: [Dagger/MissingBinding] com.ludiras.ameisin.App cannot be provided without an @Inject constructor or an @Provides-annotated method. This type supports members injection but cannot be implicitly provided.
public abstract interface AppComponent {
^
A binding with matching key exists in component: com.ludiras.ameisin.dagger.component.AppComponent
com.ludiras.ameisin.App is injected at
com.ludiras.ameisin.dagger.modules.AppModule.provideApplication(app)
android.content.Context is injected at
com.ludiras.ameisin.dagger.modules.DatabaseModule.provideUserDataBase(context)
com.ludiras.ameisin.database.UsersDatabase is injected at
com.ludiras.ameisin.dagger.modules.DatabaseModule.provideUserDao(usersDatabase)
com.ludiras.ameisin.database.dao.UserDao is injected at
com.ludiras.ameisin.dagger.modules.LoginModule.provideRegisterRepository(�, userDao)
com.ludiras.ameisin.ui.login.repository.RegisterRepository is injected at
com.ludiras.ameisin.ui.login.viewmodel.LoginViewModel(registerRepository, �)
javax.inject.Provider<com.ludiras.ameisin.ui.login.viewmodel.LoginViewModel> is injected at
com.ludiras.ameisin.dagger.modules.ViewModelFactory(viewModelProvider)
com.ludiras.ameisin.dagger.modules.ViewModelFactory<com.ludiras.ameisin.ui.login.viewmodel.LoginViewModel> is injected at
com.ludiras.ameisin.ui.login.view.LoginFragment.viewModelFactory
com.ludiras.ameisin.ui.login.view.LoginFragment is injected at
dagger.android.AndroidInjector.inject(T) [com.ludiras.ameisin.dagger.component.AppComponent ? com.ludiras.ameisin.dagger.modules.LoginBuilder_BindLoginFragment$app_debug.LoginFragmentSubcomponent][WARN] Incremental annotation processing requested, but support is disabled because the following processors are not incremental: androidx.room.RoomProcessor (DYNAMIC).
My LoginModule class:我的 LoginModule 类:
@Module
class LoginModule {
@Provides
@Singleton
fun provideFirebaseAuth(): FirebaseAuth = FirebaseAuth.getInstance()
@Provides
@Singleton
fun provideFirebaseFirestore(): FirebaseFirestore = FirebaseFirestore.getInstance()
@Provides
@Singleton
fun provideLoginRepository(firebaseAuth: FirebaseAuth): LoginRepository =
LoginRepository(firebaseAuth)
@Provides
@Singleton
fun provideRegisterRepository(
firebaseAuth: FirebaseAuth,
firebaseFirestore: FirebaseFirestore,
userDao: UserDao
): RegisterRepository = RegisterRepository(userDao, firebaseFirestore, firebaseAuth)
}
And my LoginBuilder class:还有我的 LoginBuilder 类:
@Module
abstract class LoginBuilder {
@ContributesAndroidInjector()
internal abstract fun bindLoginFragment(): LoginFragment
}
Modify your AppComponent
as follows.如下修改您的
AppComponent
。
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: App): Builder
fun build(): AppComponent
}
fun inject(app: App)
}
Its failing because you have bounded a dependency it cannot be accessed from sub component where it needed for injection.它失败了,因为您绑定了一个依赖项,无法从需要注入的子组件访问它。 ie dependency of
App
.即
App
依赖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.