Search code examples
android-studiomvvmdependency-injectiondaggerandroid-viewmodel

How can I use constructor injection for ViewModel with Dagger2 android?


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


Solution

  • 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 }