Почему добавление аннотации @Singleton к реализации ViewModelProvider.Factory приводит к ошибке компиляции [Dagger / MissingBinding]? - PullRequest
0 голосов
/ 04 октября 2018

Я пытался использовать Dagger2 для внедрения ViewModelProvider.Factory реализации, как в этом примере: GithubBrowserExample Я скопировал точно такой же класс, однако при попытке построить я получаю следующую ошибку:

error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] java.util.Map<java.lang.Class<? extends android.arch.lifecycle.ViewModel>,javax.inject.Provider<android.arch.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.

Я потратил 2 дня, пытаясь найти решение, и все было связано с подстановочными знаками и использованием аннотации @JvmSuppressWildcards, которую я уже использовал в своем классе, я также пытался изменить Map для MutableMap в сигнатуре конструктора, только чтобы получить ту же ошибку, пока я случайно не удалил @Singleton из:

@Singleton
class GithubViewModelFactory @Inject constructor(
    private val creators: Map<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")
        try {
            @Suppress("UNCHECKED_CAST")
            return creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }

    }
}

, и после этого мой проект скомпилировался, и эта досадная ошибка исчезла!что я делаю не так?

1 Ответ

0 голосов
/ 05 октября 2018

Как правильно указал Дэвид Меденжак , проблема была связана с областями, оказалось, что я включил ViewModelModule в мои MainActivityModule, а не в мои AppModule и из-за компонента/ субкомпонентная структура AppModule не знала, как предоставить GithubViewModelFactory, потому что @Provides был внутри дочернего субкомпонента.

...