Dagger / MissingBinding java.util.Map <java.lang.Class <? extends ViewModel>, Provider <ViewModel>> не может быть предоставлен без аннотируемого метода @ Provides - PullRequest
1 голос
/ 13 апреля 2019

Вот как я пытаюсь предоставить мой ViewModelFactory:

@Suppress("UNCHECKED_CAST")
@Singleton
class ViewModelFactory @Inject constructor(
    private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>
) : ViewModelProvider.Factory {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T = viewModels[modelClass]?.get() as T
}

@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)

И вот как я связываю ViewModelFactory:

@Suppress("unused")
@Module
abstract class ViewModelModule  {
    @Binds
    internal abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(MainViewModel::class)
    internal abstract fun mainViewModel(viewModel: MainViewModel): ViewModel
}

Я получаю следующую ошибку во время сборки:

di/Injector.java:9: error: [Dagger/MissingBinding] java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.

От моего Activity Я пытаюсь получить ViewModelFactory таким образом:

@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory

Ответы [ 3 ]

6 голосов
/ 14 апреля 2019

После копания немного больше я нашел проблему.Это совершенно не связано с кодом, который я использую.Это касается Kotlin 1.3.30.

Здесь еще немного информации об этом.

Понижение до Kotlin 1.3.21 решило проблему.

0 голосов
/ 04 июля 2019
 No need to Downgrade the Kotlin version. As the day of Post my Kotlin version
 is : '1.3.40'

 Use dagger dependency in build.gradle

 apply plugin: 'kotlin-kapt'

 //Dagger dependencies
implementation 'com.google.dagger:dagger:2.22.1'
kapt 'com.google.dagger:dagger-compiler:2.22.1'

implementation 'com.google.dagger:dagger-android:2.22'
implementation 'com.google.dagger:dagger-android-support:2.22' // if you use the support libraries
kapt 'com.google.dagger:dagger-android-processor:2.22'


And for Java use the following dagger dependency

 //Dagger dependencies
implementation 'com.google.dagger:dagger:2.22.1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.22.1'

implementation 'com.google.dagger:dagger-android:2.22'
implementation 'com.google.dagger:dagger-android-support:2.22' // if you use the support libraries
annotationProcessor 'com.google.dagger:dagger-android-processor:2.22'
0 голосов
/ 28 июня 2019

Я недавно столкнулся с той же проблемой. Версия Котлин: 1.3.40 Dagger: 2.23.2 Я попытался следовать решениям, упомянутым в этом посте и здесь

но никто, похоже, не работал. Процессор аннотаций Dagger не очень хорошо работает с KAPT, и по той же причине сборки терпят неудачу. Это также обновляется в Kotlin , выпуск тоже.

Для меня преобразование ViewModelKey и ViewModelFactory в java сработало. Для Dagger, проблема отслеживания может быть найдена здесь .

Обновление Добавление @JvmSuppressWildcards исправило проблему. Код выглядит так:

private val providers: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
...