Dagger 2 组件中存在具有匹配键的绑定
Dagger 2 A binding with matching key exists in component
我看到这是一个已经在这里被问到的问题,但是在我的代码中转了好几次之后似乎无法解决它。我正在尝试在我的应用程序中使用 Dagger 2 实现 Room,我已经创建了必要的模块,我在其中创建了对数据库和 Dao 的引用 class。
问题是当我编译我的项目时,它给了我这个错误,我已经尝试了很多东西,但我无法解决,我传递了部分代码,看看你是否可以帮助我:
我的 class 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)
}
我的 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();
}
}
我的控制台错误:
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).
我的登录模块class:
@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)
}
还有我的 LoginBuilder class:
@Module
abstract class LoginBuilder {
@ContributesAndroidInjector()
internal abstract fun bindLoginFragment(): LoginFragment
}
按如下方式修改您的AppComponent
。
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: App): Builder
fun build(): AppComponent
}
fun inject(app: App)
}
它失败了,因为你已经绑定了一个依赖项,它不能从需要注入的子组件访问。即 App
.
的依赖
我看到这是一个已经在这里被问到的问题,但是在我的代码中转了好几次之后似乎无法解决它。我正在尝试在我的应用程序中使用 Dagger 2 实现 Room,我已经创建了必要的模块,我在其中创建了对数据库和 Dao 的引用 class。
问题是当我编译我的项目时,它给了我这个错误,我已经尝试了很多东西,但我无法解决,我传递了部分代码,看看你是否可以帮助我:
我的 class 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)
}
我的 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();
}
}
我的控制台错误:
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).
我的登录模块class:
@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)
}
还有我的 LoginBuilder class:
@Module
abstract class LoginBuilder {
@ContributesAndroidInjector()
internal abstract fun bindLoginFragment(): LoginFragment
}
按如下方式修改您的AppComponent
。
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: App): Builder
fun build(): AppComponent
}
fun inject(app: App)
}
它失败了,因为你已经绑定了一个依赖项,它不能从需要注入的子组件访问。即 App
.