Dagger не может внедрить параметр типа интерфейс в конструктор ViewModel с помощью Dagger Android - PullRequest
1 голос
/ 25 сентября 2019

Почему я не могу внедрить типы интерфейсов в конструкторы 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, успешно компилируется и работает.

Кто-нибудь знает, в чем может быть проблема?

1 Ответ

1 голос
/ 25 сентября 2019

Решил проблему.Использование фабрики моделей общего вида, описанной в этом выпуске Github:

https://github.com/google/dagger/issues/1273#issuecomment-447997439

...