Skip to content

Instantly share code, notes, and snippets.

@felipeslongo
Created December 7, 2024 23:53
Show Gist options
  • Save felipeslongo/2f7d93869a68184ac445b586b0036cd4 to your computer and use it in GitHub Desktop.
Save felipeslongo/2f7d93869a68184ac445b586b0036cd4 to your computer and use it in GitHub Desktop.
DaggerViewModelFactory - How to Inject ViewModel with Dagger 1
package com.fsl.gist
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import co.poynt.setupwizard.fragmentsV2.WelcomeViewModel
import co.poynt.setupwizard.fragmentsV2.LanguagesViewModel
import co.poynt.setupwizard.fragmentsV2.SimCardCheckViewModel
import javax.inject.Inject
import javax.inject.Provider
import javax.inject.Singleton
/**
* Implementation of [ViewModelProvider.Factory] responsible constructing viewmodels for this app.
* See https://stackoverflow.com/questions/54347924/inject-property-into-viewmodel-using-dagger-2
*/
@Singleton
class DaggerViewModelFactory @Inject constructor(
// Inject here EVERY. SINGLE. ViewModel signature from the app.
languageViewModelProvider: Provider<LanguagesViewModel>,
welcomeViewModelProvider: Provider<WelcomeViewModel>,
simCardCheckViewModelProvider: Provider<SimCardCheckViewModel>,
) : ViewModelProvider.Factory {
/**
* Sadly only Dagger2 supports Multibinding, we are stuck with Dagger Classic,
* so lets make this hack.
*/
@Suppress("UNCHECKED_CAST")
private val creators = mapOf<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>(
LanguagesViewModel::class.java to (languageViewModelProvider as Provider<ViewModel>),
WelcomeViewModel::class.java to (welcomeViewModelProvider as Provider<ViewModel>),
SimCardCheckViewModel::class.java to (simCardCheckViewModelProvider as Provider<ViewModel>)
)
override fun <T : ViewModel> create(modelClass: Class<T>): T {
//TODO "Support passing SavedStateHandle or just migrate Hilt"
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 view model class $modelClass")
}
try {
return creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment