简体   繁体   English

Dagger 2 组件中存在具有匹配键的绑定

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

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