Инжектор конструктора Dagger Kotlin не работает - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть следующий модуль с методом @Provides с квалификатором

@Module
class VocabularyModule {

    @VocabularyProviders
    @Singleton
    @Provides
    fun provideVocabularies(): List<VocabularyProvider> {
        return listOf(
                AnimalsVocabularyProvider(),
                FamilyVocabularyProvider(),
                FoodVocabularyProvider(),
                NumberVocabularyProvider(),
                ColorsVocabularyProvider(),
                FreeTimeVocabularyProvider(),
                SportVocabularyProvider(),
                NatureVocabularyProvider(),
                PeopleVocabularyProvider(),
                TransportationVocabularyProvider()
        )
    }
}

@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class VocabularyProviders

Тогда есть мой класс, в который я хочу добавить этот список через конструктор и спецификатор:

class VocabularyFactory
@Inject constructor(@param:VocabularyProviders val providers: List<VocabularyProvider>) {

    fun getVocabulary(category: VocabularyCategory): Vocabulary {
        for (provider in providers) {
            if (category == provider.category) {
                return provider.vocabulary
            }
        }
        throw IllegalStateException("didn't find provider that could provide vocabulary of $category category")
    }

}

Я получаю эту ошибку, но все выглядит правильно

11: error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] @cz.ejstn.learnlanguageapp.core.dagger.module.vocabulary.VocabularyProviders java.util.List<? extends cz.ejstn.learnlanguageapp.vocabulary.model.factory.VocabularyProvider> cannot be provided without an @Provides-annotated method.

1 Ответ

0 голосов
/ 08 сентября 2018

Я продолжил перелистывать похожие вопросы и наткнулся на этот: Мульти-связывание кинжала 2 с Kotlin

Итак, насколько я понимаю, компилятор kotlin "немного путается" с универсальными типами параметров, что привело к тому, что кинжал не смог связать их, я думаю.

Я изменил конструктор фабрики, чтобы избежать этого - addind @JvmSuppressWildcards annotation:

class VocabularyFactory
@Inject constructor(@param:VocabularyProviders val providers:@JvmSuppressWildcards List<VocabularyProvider>) {
...
}

Сохранение этого вопроса здесь, потому что больше людей может столкнуться с этим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...