Ruben Quadros
03/25/2022, 5:19 PMViewModelOwner
in koin-androidx-navigation
module and then calling this extension function from koin-androidx-compose getViewModel(..)
func as follows:
fun ViewModelOwner.fromStoreOwner(storeOwner: ViewModelStoreOwner): ViewModelOwner = ViewModelOwner(
store = storeOwner.viewModelStore,
stateRegistry = stateRegistry,
defaultArgs = if (storeOwner is NavBackStackEntry) storeOwner.arguments else null
)
inline fun <reified T : ViewModel> getViewModel(
qualifier: Qualifier? = null,
owner: ViewModelStoreOwner? = null,
scope: Scope = GlobalContext.get().scopeRegistry.rootScope,
noinline parameters: ParametersDefinition? = null,
): T {
val storeOwner = owner?.let { ViewModelOwner.fromStoreOwner(it) } ?: getComposeViewModelOwner()
return remember(qualifier, parameters) {
scope.getViewModel(qualifier, { storeOwner }, parameters)
}
}
koin-androidx-navigation
dependency on
koin-androidx-compose
arnaud.giuliani
04/04/2022, 7:01 AMRuben Quadros
04/14/2022, 4:58 PMinline fun <reified T : ViewModel> viewModel(
qualifier: Qualifier? = null,
owner: ViewModelStoreOwner? = null,
scope: Scope = GlobalContext.get().scopeRegistry.rootScope,
noinline parameters: ParametersDefinition? = null,
): Lazy<T> {
val storeOwner = owner?.let { ViewModelOwner.fromCompose(it) } ?: getComposeViewModelOwner()
val state = (owner as? NavBackStackEntry)?.arguments ?: storeOwner.defaultArgs
return remember(qualifier, parameters) {
ViewModelLazy(T::class, { storeOwner.storeOwner.viewModelStore }){
getViewModelFactory<T>(
owner = {storeOwner},
qualifier = qualifier,
parameters = parameters,
scope = scope,
state = state?.let { {it} } ?: emptyState()
)
}
}
}
fun getComposeViewModelOwner(): ViewModelOwner {
return ViewModelOwner.fromCompose(
LocalViewModelStoreOwner.current!!,
LocalSavedStateRegistryOwner.current
)
}
fun ViewModelOwner.Companion.fromCompose(
storeOwner: ViewModelStoreOwner,
stateRegistry: SavedStateRegistryOwner? = null
) = ViewModelOwner(
storeOwner = storeOwner,
stateRegistry = stateRegistry,
defaultArgs = (storeOwner as? NavBackStackEntry)?.arguments
)
fun ViewModelOwner.Companion.fromCompose(
storeOwner: ViewModelStoreOwner
) = ViewModelOwner(
storeOwner = storeOwner,
defaultArgs = (storeOwner as? NavBackStackEntry)?.arguments
)
But ViewModelOwner
will be deprecated next? If so, what should I use?arnaud.giuliani
04/15/2022, 6:59 AMRuben Quadros
04/15/2022, 4:54 PM