How can we use saveStateHandle in viewModel via co...
# koin
a
How can we use saveStateHandle in viewModel via compose or if not supported directly how can we get instance of saveStateHandle and pass it as parameter ?
a
saveStateHandle is a regular parameter that is detected by Koin. Just use it in your constructor
a
how should I provide the dependency while defining module ?
Copy code
viewModel {  LoginViewModel(savedStateHandle = get(), get()) }
p
I think it's like:
Copy code
viewModel {  LoginViewModel() }
Right @arnaud.giuliani?
a
yes, just
viewModel {  LoginViewModel(savedStateHandle = get(), get()) }
@Pedro Francisco de Sousa Neto missing get() here 🙂
a
not working it's crashing creating viewmodel instance like this
val viewModel: LoginViewModel = getViewModel()
do I need to use any different method to create?
a
from where do you call it?
a
is there anything wrong
a
use
koinViewModel
instead of
getViewModel
but should'n change much
what is the stack trace?
a
NoBeanDefFoundException
Copy code
org.koin.core.error.NoBeanDefFoundException: |- No definition found for class:'androidx.lifecycle.SavedStateHandle'. Check your definitions!
same with
koinViewModel
,if I see correctly internally it is using
getViewModel
only
a
yep
a
I created a helper is it fine, bcz now I am invoking parameters early, will lead to issues / performance loss?
Copy code
@OptIn(KoinInternalApi::class)
@Composable
inline fun <reified T : ViewModel> NavController.getViewModel(
    qualifier: Qualifier? = null,
    owner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
        "No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
    },
    scope: Scope = GlobalContext.get().scopeRegistry.rootScope,
    noinline parameters: ParametersDefinition? = null
): T {
    val params = remember(parameters) {
        parameters?.invoke()?.values?.toTypedArray()
    }
    val savedStateHandle = currentBackStackEntry?.savedStateHandle

    return org.koin.androidx.compose.getViewModel(
        qualifier = qualifier,
        owner = owner,
        scope = scope,
        parameters = {
            if (params != null) {
                parametersOf(
                    savedStateHandle,
                    *params
                )
            } else {
                parametersOf(savedStateHandle)
            }
        }
    )
}
a
koinNavViewModel
is doing the same I believe 🤔
a
I don't see
koinNavViewModel
anywhere even in koin doc or is there any another dependency I need?
357 Views