Итак, я работал над примером проекта MVVM с использованием Dagger. У меня есть фабрика Viewmodel, которая выглядит следующим образом:
class DaggerViewModelFactory @Inject constructor(private val viewModelsMap: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>) :
ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = viewModelsMap[modelClass] ?:
viewModelsMap.asIterable().firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
return try {
creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
Фабрика модуля Viewmodel
@Module
abstract class ViewModelFactoryModule {
@Binds
abstract fun bindViewModelFactory(viewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory
}
Я получил ViewModelModule:
@Module
abstract class MyViewModelModule {
@Binds
@IntoMap
@ViewModelKey(TakePicturesViewModel::class)
abstract fun bindTakePictureViewModel(takePicturesViewModel: TakePicturesViewModel): ViewModel
}
Компонент, который идет например:
@PerActivity
@Subcomponent(modules = [ActivityModule::class, ViewModelFactoryModule::class, MyViewModelModule::class])
interface ActivityComponent {
fun inject(mainActivity: MainActivity)
}
Модель представления, которая выглядит следующим образом:
class TakePicturesViewModel @Inject constructor(app: Application): AndroidViewModel(app) {...
Таким образом, я могу либо внедрить свою модель представления в свою деятельность, используя фабрику модели представления, например:
@Inject
lateinit var viewModelFactory: DaggerViewModelFactory
private lateinit var takePicturesViewModel: TakePicturesViewModel
.
.
.
takePicturesViewModel = ViewModelProviders.of(this, viewModelFactory).get(TakePicturesViewModel::class.java)
Или вообще не с фабрикой viewmodel, например:
@Inject
lateinit var takePicturesViewModel: TakePicturesViewModel
Оба способа работают, поэтому мне было интересно, какой из них правильный, если использование Dagger позволяет мне вводить модель представления без необходимости использования модели представления, есть ли хорошая причина для ее сохранения? Или мне просто нужно избавиться от этой модели представления?
Заранее благодарим за любой совет.
Привет