Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
ViewModelBinder utility class for Kodein DI
inline fun <reified ViewModelT : ViewModel> BindActivity.viewModelBinder() = lazy {
activitybBinder<ViewModelT>(bindActivity = this)
}
inline fun <reified ViewModelT : ViewModel> BindFragment.viewModelBinder() = lazy {
ViewModelProviders
.of(this,
getFactory<ViewModelT>(kodein))
.get(ViewModelT::class.java)
}
inline fun <reified ViewModelT : ViewModel> BindFragment.viewModelActivityBinder() = lazy {
val bindActivity = activity as BindActivity
activitybBinder<ViewModelT>(bindActivity)
}
inline fun <reified ViewModelT : ViewModel> activitybBinder(bindActivity: BindActivity): ViewModelT {
return ViewModelProviders
.of(bindActivity,
getFactory<ViewModelT>(bindActivity.kodein))
.get(ViewModelT::class.java)
}
inline fun <reified ViewModelT : ViewModel> getFactory(
kodein: Kodein) =
object : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return Kodein {
extend(kodein)
}.run {
val viewModel by instance<ViewModelT>()
viewModel
} as T
}
}
//From any Activity extending from InjectedActivity
private val activityViewModel by viewModelBinder<MyActivityViewModel>()
override fun activityModule() = Kodein.Module(MyActivity.TAG) {
bind() from provider { MyActivityViewModel(instance(), instance()) }
}
//From any fragment extending from InjectedFragment
private val fragmentViewModel by viewModelBinder<MyFragmentViewModel>()
override fun fragmentModule() = Kodein.Module(MyFragment.TAG) {
bind() from provider { MyFragmentViewModel(instance()) }
}
//If you want to get activity ViewModel from the fragment
private val activityViewModel by viewModelActivityBinder<MyActivityViewModel>()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment