Joost Klitsie
06/14/2022, 1:42 PMbindProvider { MyViewModel() }
and then using rememberViewModel()
(using Compose and android x viewmodel libraries)Joost Klitsie
06/14/2022, 1:43 PMbindViewModel
method:
inline fun <reified T: Any, reified VM: ViewModel> DI.Builder.bindViewModel(
tag: Any? = null,
overrides: Boolean? = null,
noinline creator: DirectDI.() -> VM
) = bindFactory<ViewModelStoreOwner, T>(tag, overrides) { viewModelStoreOwner ->
val result by ViewModelLazy(
viewModelClass = VM::class,
storeProducer = { viewModelStoreOwner.viewModelStore },
factoryProducer = {
object : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return creator() as T
}
}
}
)
result as T
}
that can be combined with:
@Composable
inline fun <reified VM: Any> rememberViewModel(
tag: Any? = null,
viewModelStoreOwner: ViewModelStoreOwner = LocalViewModelStoreOwner.current ?: error("")
) = with(localDI()) {
remember(viewModelStoreOwner) {
instance<ViewModelStoreOwner, VM>(tag = tag, arg = viewModelStoreOwner)
}
}
Joost Klitsie
06/14/2022, 1:44 PMJoost Klitsie
06/14/2022, 2:07 PMbindViewModel<AppViewModel, DefaultAppViewModel> {
DefaultAppViewModel()
}
And inject like this:
val viewModel by rememberViewModel<AppViewModel>()