Gist for Medium version of https://ajkueterman.dev/posts/android-viewmodel-manual-dependency-injection-made-easy/
/** | |
* Get a [ViewModel] in an [ComponentActivity]. | |
*/ | |
@MainThread | |
inline fun <reified VM : ViewModel> ComponentActivity.viewModelBuilder( | |
noinline viewModelInitializer: () -> VM | |
): Lazy<VM> { | |
return ViewModelLazy( | |
viewModelClass = VM::class, | |
storeProducer = { viewModelStore }, | |
factoryProducer = { | |
return@ViewModelLazy object : ViewModelProvider.Factory { | |
override fun <T : ViewModel?> create(modelClass: Class<T>): T { | |
@Suppress("UNCHECKED_CAST")// Casting T as ViewModel | |
return viewModelInitializer.invoke() as T | |
} | |
} | |
} | |
) | |
} | |
/** | |
* Get a [ViewModel] in a [Fragment]. | |
*/ | |
@MainThread | |
inline fun <reified VM : ViewModel> Fragment.activityViewModelBuilder( | |
noinline viewModelInitializer: () -> VM | |
): Lazy<VM> { | |
return ViewModelLazy( | |
viewModelClass = VM::class, | |
storeProducer = { requireActivity().viewModelStore }, | |
factoryProducer = { | |
object : ViewModelProvider.Factory { | |
override fun <T : ViewModel?> create(modelClass: Class<T>): T { | |
@Suppress("UNCHECKED_CAST")// Casting T as ViewModel | |
return viewModelInitializer.invoke() as T | |
} | |
} | |
} | |
) | |
} |
dependencies { | |
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment