Skip to content

Instantly share code, notes, and snippets.

@sidaknanda
Created June 20, 2020 11:18
Show Gist options
  • Save sidaknanda/9c3e53bb512d465ccbae53ad321d6b77 to your computer and use it in GitHub Desktop.
Save sidaknanda/9c3e53bb512d465ccbae53ad321d6b77 to your computer and use it in GitHub Desktop.
Activity/Fragment Kotlin Extension for initialising ViewModel with Factory/Arguments constructor
inline fun <reified T : ViewModel> Fragment.getActivityViewModel(noinline creator: (() -> T)? = null): T {
return if (creator == null)
ViewModelProviders.of(activity!!).get(T::class.java)
else
ViewModelProviders.of(activity!!, BaseViewModelFactory(creator)).get(T::class.java)
}
inline fun <reified T : ViewModel> Fragment.getViewModel(noinline creator: (() -> T)? = null): T {
return if (creator == null)
ViewModelProviders.of(this).get(T::class.java)
else
ViewModelProviders.of(this, BaseViewModelFactory(creator)).get(T::class.java)
}
inline fun <reified T : ViewModel> FragmentActivity.getViewModel(noinline creator: (() -> T)? = null): T {
return if (creator == null)
ViewModelProviders.of(this).get(T::class.java)
else
ViewModelProviders.of(this, BaseViewModelFactory(creator)).get(T::class.java)
}
/////////////////////
class BaseViewModelFactory<T>(val creator: () -> T) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return creator() as T
}
}
//////////////////// HOW TO USE ////////////////
// In acitivity/Fragment
private val viewModel: MyViewModel by lazy {
getActivityViewModel {
MyViewModel(arg1, arg2, arg3)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment