如果没有@Provides注释的方法,将无法提供,组件中存在具有匹配键的绑定

问题描述 投票:0回答:1

我正在尝试在种子项目中添加dagger2以学习用途(我不是专家),但我遇到了同样的问题:

e:/Users/foca/projects/personalProjects/bar-droid-application/bar-droid/app/build/tmp/kapt3/stubs/debug/com/bar/bar_droid/di/AppComponent.java:8:错误:[Dagger / MissingBinding] com.bar.bar_droid.domain.repository.RegisterRepository如果没有@Provides注释的方法,则无法提供。公共抽象接口AppComponent扩展了dagger.android.AndroidInjector {^组件中存在具有匹配键的绑定:com.bar.bar_droid.ui.accessflow.di.AccessScreenProvider_ProvideRoleSelectorFragmentFactory.RoleSelectionFragmentSubcomponentcom.bar.bar_droid.domain.repository.RegisterRepository在以下位置注入com.bar.bar_droid.domain.interactor.userregistration.UserRegistrationUseCase(registerRepository,…)com.bar.bar_droid.domain.interactor.userregistration.UserRegistrationUseCase在以下位置注入com.bar.bar_droid.ui.accessflow.roleselector_fragment.viewmodel.RoleSelectionViewModel(…,userRegistrationUseCase)com.bar.bar_droid.ui.accessflow.roleselector_fragment.viewmodel.RoleSelectionViewModel在以下位置注入com.bar.bar_droid.ui.di.ViewModelModule.provideRoleSelectionViewModel(roleSelectionViewModel)java.util.Map,javax.inject.Provider>被注入com.bar.bar_droid.utils.mvvm.ViewModelFactory(创建者)com.bar.bar_droid.utils.mvvm.ViewModelFactory在以下位置注入com.bar.bar_droid.ui.accessflow.loginselector_fragment.LoginFragment.viewModelFactorycom.bar.bar_droid.ui.accessflow.loginselector_fragment.LoginFragment在以下位置注入dagger.android.AndroidInjector.inject(T)[com.bar.bar_droid.di.AppComponent→com.bar.bar_droid.di.ActivityBuilderModule_BindAccessActivity.AccessActivitySubcomponent→com.bar.bar_droid.ui.accessflow.di.AccessScreenProvider_ProvideLoginSelectorFragmentFactory.LoginFragmentFactory也可以在以下位置提出要求:com.bar.bar_droid.domain.interactor.userregistration.UserRegistrationUseCase(registerRepository,…)以下其他入口点也依赖于此:dagger.android.AndroidInjector.inject(T)[com.bar.bar_droid.di.AppComponent→com.bar.bar_droid.di.ActivityBuilderModule_BindAccessActivity.AccessActivitySubcomponent→com.bar.bar_droid.ui.accessflow.di.AccessScreenProvider_ProvideMailPasswordFragmentFactory.MailPasswordSignUpdagger.android.AndroidInjector.inject(T)[com.bar.bar_droid.di.AppComponent→com.bar.bar_droid.di.ActivityBuilderModule_BindMainActivity.MainActivitySubcomponent→com.bar.bar_droid.ui.mainflow.di.MainFlowProvider_ProvideMenuFragmentFactory.MenuFragmentSubcomponent] >

这里是我的代码:

应用程序:

class MainApplication : Application(), HasAndroidInjector {

    @Inject lateinit var androidInjector : DispatchingAndroidInjector<Any>

    override fun onCreate() {
        super.onCreate()

        // Starts Dagger
        DaggerAppComponent.builder()
            .application(this)
            .build()
            .inject(this)
    }

    override fun androidInjector(): AndroidInjector<Any> = androidInjector
}

匕首组件:

@Singleton
@Component(
    modules = [AndroidSupportInjectionModule::class,
        ApplicationModule::class,
        RoomDatabaseModule::class,
        FirebaseModule::class,
        GoogleModule::class,
        ActivityBuilderModule::class]
)
interface AppComponent : AndroidInjector<MainApplication> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(app: Application): Builder
        fun build(): AppComponent
    }
}

ActivityBuilderModule:

@Module
abstract class ActivityBuilderModule {

    @PerActivity
    @ContributesAndroidInjector(modules = [AccessScreenProvider::class, AccessScreenDependencyProvider::class])
    abstract fun bindAccessActivity(): AccessActivity

    @PerActivity
    @ContributesAndroidInjector(modules = [MainFlowProvider::class])
    abstract fun bindMainActivity(): MainActivity
}

AccessActivity的片段:

@Module
abstract class AccessScreenProvider {

    @PerFragment
    @ContributesAndroidInjector(modules = [ViewModelModule::class, LoginSelectorProvider::class])
    abstract fun provideLoginSelectorFragmentFactory(): LoginFragment

    @PerFragment
    @ContributesAndroidInjector(modules = [ViewModelModule::class])
    abstract fun provideMailPasswordFragmentFactory(): MailPasswordSignUpFragment

    @PerFragment
    @ContributesAndroidInjector(modules = [ViewModelModule::class, RoleSelectionProvider::class])
    abstract fun provideRoleSelectorFragmentFactory(): RoleSelectionFragment
}

ViewModelModule:

@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
internal annotation class ViewModelKey(val value: KClass<out ViewModel>)

@Module
abstract class ViewModelModule {

    @Binds
    abstract fun provideViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory

    @Binds
    @PerFragment
    @IntoMap
    @ViewModelKey(LoginViewModel::class)
    abstract fun provideLoginViewModel(loginViewModel: LoginViewModel): ViewModel

    @Binds
    @PerFragment
    @IntoMap
    @ViewModelKey(MailPasswordSignUpViewModel::class)
    abstract fun provideMailPasswordSighUpViewModel(mailPasswordSignUpViewModel: MailPasswordSignUpViewModel): ViewModel

    @Binds
    @PerFragment
    @IntoMap
    @ViewModelKey(RoleSelectionViewModel::class)
    abstract fun provideRoleSelectionViewModel(roleSelectionViewModel: RoleSelectionViewModel): ViewModel
}

最后是RoleSelectionProvide:

@Module
class RoleSelectionProvider {

    @Provides
    @PerFragment
    fun provideRealAuthDataSource(fireBaseAuth: FirebaseAuth): UserAuthDataSource = RealUserAuthDataSource(fireBaseAuth)

    @Provides
    @PerFragment
    fun provideRegisterRepository(realUserAuthDataSource: RealUserAuthDataSource, userProfileDao: UserProfileDao): RegisterRepository {
        return RegisterRepositoryImpl(realUserAuthDataSource, userProfileDao)
    }
}

我要注入的唯一位置是[[RegisterRepositoryImpl

,位于[[UserRegistrationUseCase上,我不知道自己在做什么错。我正在尝试在种子项目中添加dagger2以学习用途(我不是专家),但我遇到了同样的问题:e:/ Users / foca / projects / personalProjects / bar-droid-application / bar -droid / app / ...
android kotlin dependency-injection dagger-2 dagger
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.