我正在尝试在种子项目中添加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:
,位于[[UserRegistrationUseCase上,我不知道自己在做什么错。我正在尝试在种子项目中添加dagger2以学习用途(我不是专家),但我遇到了同样的问题:e:/ Users / foca / projects / personalProjects / bar-droid-application / bar -droid / app / ...@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