我正在使用众所周知的Dagger-ViewModelFactory模式来为所有活动中的所有ViewModel
注入工厂。
@activityScope
class ViewModelFactory @Inject constructor(
private val creators: MutableMap<Class<out ViewModel>,@JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = creators[modelClass] ?: creators.entries.firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
return creator.get() as T
}
}
我的问题是,当我将工厂注入activity
时,Dagger失败了,因为我将不使用的ViewModels
的对象提供者并不总是可访问的。这不是因为尚未添加包含提供程序的模块。
例如,我有一个 LogIn 活动和一个 SignUp 活动,这是我为它们添加子组件的方式:
@ContributesAndroidInjector(modules = [
ViewModelModule::class,FirebaseModule::class,LogInmodule::class,BindLogInmodule::class
])
@activityScope
internal abstract fun loginactivityInjector(): Loginactivity
@ContributesAndroidInjector(modules = [
ViewModelModule::class,SignUpModule::class,BindSignUpModule::class
])
@activityScope
internal abstract fun signUpactivityInjector(): SignUpactivity
请注意,当我为SignUpactivity
创建子组件时,我不添加模块LogInmodule
,因为我不需要该模块中的绑定。
结果是我得到了错误
e:com.package.my.AppComponent.java:8:错误:[Dagger / MissingBinding]如果没有@Provides注释的方法,则无法提供com.package.my.login.domain.LogInAuthenticator。 公共抽象接口AppComponent扩展了dagger.android.AndroidInjector { ^ 组件中存在具有匹配键的绑定:com.package.my.di.activityInjectorsModule_LoginactivityInjector $ app_prodDebug.LoginactivitySubcomponent com.package.my.login.domain.LogInAuthenticator插入在 com.package.my.login.repository.LoginRepository(logInAuthenticator) com.package.my.login.repository.LoginRepository在以下位置注入 com.package.my.login.domain.LoginUseCase(loginRepository) com.package.my.login.domain.LoginUseCase在以下位置注入 com.package.my.login.presentation.LoginViewModel(loginUseCase) com.package.my.login.presentation.LoginViewModel在以下位置注入 com.package.my.di.ViewModelModule.provideLoginViewModel(viewModel) java.util.Map,javax.inject.Provider>在以下位置注入 com.package.my.di.ViewModelFactory(创建者) com.package.my.di.ViewModelFactory在以下位置注入 com.package.my.di.ViewModelModule.bindViewModelFactory $ app_prodDebug(factory) androidx.lifecycle.ViewModelProvider.Factory被注入 com.package.my.login.ui.SignUpactivity.viewModelFactory com.package.my.login.ui.SignUpactivity在以下位置注入 dagger.android.AndroidInjector.inject(T)[com.package.my.di.AppComponent→com.package.my.di.activityInjectorsModule_SignUpactivityInjector $ app_prodDebug.SignUpactivitySubcomponent]
发生这种情况是因为LogInAuthenticator
由LogInmodule
提供。
这是否意味着即使我真的不需要在LogInmodule
中创建GoogleSignInClient
,唯一的解决方案就是添加SignUpactivity
?