Редактировать
Добавление @ViewModelKey и проверка того, что все видовые модели имеют аннотацию @Inject, сделали свое дело
Инъекция ViewModels с использованием библиотеки Dagger2 Di и ViewModelFactory, что привело к отсутствиюошибка компоновки привязки.
Я получаю следующую ошибку:
AppComponent.java:12: 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. public abstract interface AppComponent extends dagger.android.AndroidInjector<com.honing.daggerexploration.DaggerExplorationApplication> {
^
java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
com.honing.daggerexploration.di.DaggerViewModelFactory(creators)
com.honing.daggerexploration.di.DaggerViewModelFactory is injected at
com.honing.daggerexploration.features.MainActivity.viewModelFactory
com.honing.daggerexploration.features.MainActivity is injected at
dagger.android.AndroidInjector.inject(T) [com.honing.daggerexploration.di.AppComponent → com.honing.daggerexploration.di.modules.ActivityModule_BindActivityMain.MainActivitySubcomponent]
Я искал другие вопросы по stackoverflow, но ни один из них не решил эту проблему для меня.
Я использую последнюю версию Dagger, 2.22.1
Бьюсь об заклад, эта ошибка не связана с MVRX, так как я смог воспроизвести ее в небольшой библиотеке без использования класса модели представления mvrx,однако я намерен в конечном итоге использовать dagger2 с фреймворком mvrx и иметь возможность внедрять в него зависимости.
Некоторый код, связанный с этим:
DaggerExplorationApplication
class DaggerExplorationApplication : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().create(this)
}
}
DaggerViewModelFactory:
/**
* ViewModelFactory which uses Dagger to create the instances.
*/
class DaggerViewModelFactory @Inject constructor(
private val creators: @JvmSuppressWildcards Map<Class<out ViewModel>, Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
var creator: Provider<out ViewModel>? = creators[modelClass]
if (creator == null) {
for ((key, value) in creators) {
if (modelClass.isAssignableFrom(key)) {
creator = value
break
}
}
}
if (creator == null) {
throw IllegalArgumentException("Unknown model class: $modelClass")
}
try {
@Suppress("UNCHECKED_CAST")
return creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
ViewModelFactoryModule
@Module
abstract class ViewModelFactoryModule {
@Binds
abstract fun bindViewModelFactory(viewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory
}
ActivityModule
@Module
abstract class ActivityModule {
@ContributesAndroidInjector(modules = [ViewModelFactoryModule::class])
abstract fun bindActivityMain(): MainActivity
}
Что касается моих усилий по внедрению mvrx с помощью кинжала, то в соответствии с этим мне нужно использовать библиотеку AssistedInject по квадратам, я смотрел видео и хорошо понимаю причину этого.Тем не менее, мне не удалось создать проект из-за ошибки, описанной выше.Интересная тема chrisbanes также об этой вещи находится на этой ссылке
MVRX ViewModels с dagger2 была успешно реализована с использованием этого проекта (Tivi) chrisbanes, я пробовалследуя тому, что они сделали, но я тоже потерпел неудачу.Проблема, описанная в верхней части поста, блокирует меня.Готов предоставить любой отсутствующий код, дополнительную информацию, если необходимо, чтобы решить эту проблему.