Почему я не могу внедрить типы интерфейсов в конструкторы ViewModel при использовании Dagger Android?
Вот мой AppComponent
@Singleton
@Component(
modules = [
AndroidInjectionModule::class,
AppModule::class,
ActivityBuilder::class,
ViewModelModule::class
]
)
interface AppComponent {
fun inject(app: App)
}
Вот модуль для моей деятельности:
@Module
abstract class ActivityBuilder {
@ActivityScope
@ContributesAndroidInjector(modules = [UserDetailsModule::class])
abstract fun userDetailsActivity(): UserDetailsActivity
}
Вот UserDetailsModule
@Module
abstract class UserDetailsModule {
@Binds
@ActivityScope
abstract fun providesUserRepository(repository: UserRepositoryImpl): UserRepository
}
Вот ViewModelModule, где я следую решению фабрики модели динамического представления.
@Module
abstract class ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(UserDetailsViewModel::class)
abstract fun userDetailsViewModel(viewModel: UserDetailsViewModel): ViewModel
@Binds
abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
}
Вот конкретный класс UserRepository
class UserRepositoryImpl @Inject constructor(private val api: Api) : UserRepository { ... }
Вот UserDetailsViewModel
class UserDetailsViewModel @Inject constructor(private val userRepository: UserRepository) : ViewModel() { ... }
Когда я скомпилирую, произойдет ошибка
UserRepository cannot be provided without an @Provides-annotated method.
Однако сбивает с толку часть, когда я изменяю конструктор UserDetailsViewModel для получения UserRepositoryImpl
вместо типа UserRepository
, успешно компилируется и работает.
Кто-нибудь знает, в чем может быть проблема?