Created
December 7, 2024 23:53
-
-
Save felipeslongo/2f7d93869a68184ac445b586b0036cd4 to your computer and use it in GitHub Desktop.
DaggerViewModelFactory - How to Inject ViewModel with Dagger 1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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