I want to use ViewModel with Dagger2 but I don't know how to use constructor injection with ViewModelProviders or ViewModelProvider.Factory
How can I use ViewModel with constructor injection? Should I use ViewModelProvider.Factory or ViewModelProviders?
Update: You can find the solution with details in this link
You can create your own custom class extending ViewModelProvider.Factory
class ViewModelFactory @Inject constructor(
private val providers: @JvmSuppressWildcards Map<Class<out ViewModel>, Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
var provider = providers[modelClass]
if (provider == null) {
for ((key, value) in providers) {
if (modelClass.isAssignableFrom(key)) {
provider = value
break
}
}
}
if (provider == null) {
throw IllegalStateException("unknown model class $modelClass")
}
return provider.get() as T
}
}
Create module for this class and inject the module in your ApplicationComponent
class
@Module
abstract class ViewModelFactoryModule {
@Binds
abstract fun bindViewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
}
Then inside your fragment inject this factory
@Inject
lateinit var factory: ViewModelProvider.Factory
and initialize your viewModel like this
val vm: YourViewModel by viewModels { factory }