commonMain.org.koin.compose.viewmodel.ViewModelInternals.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of koin-compose-viewmodel-jvm Show documentation
Show all versions of koin-compose-viewmodel-jvm Show documentation
KOIN - Kotlin simple Dependency Injection Framework
/*
* Copyright 2017-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.koin.compose.viewmodel
import androidx.compose.runtime.Composable
import androidx.lifecycle.HasDefaultViewModelProviderFactory
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelStore
import androidx.lifecycle.ViewModelStoreOwner
import androidx.lifecycle.viewmodel.CreationExtras
import org.koin.core.annotation.KoinInternalApi
import org.koin.core.parameter.ParametersDefinition
import org.koin.core.parameter.ParametersHolder
import org.koin.core.qualifier.Qualifier
import org.koin.core.scope.Scope
import org.koin.mp.KoinPlatformTools
import kotlin.reflect.KClass
@KoinInternalApi
fun resolveViewModel(
vmClass: KClass,
viewModelStore: ViewModelStore,
key: String?,
extras: CreationExtras,
qualifier: Qualifier?,
scope: Scope,
parameters: (() -> ParametersHolder)?
): T {
val factory = KoinViewModelFactory(vmClass, scope, qualifier, parameters)
val provider = ViewModelProvider.create(viewModelStore, factory, extras)
val vmKey = getViewModelKey(qualifier, key, KoinPlatformTools.getClassName(vmClass))
return when {
vmKey != null -> provider[vmKey, vmClass]
else -> provider[vmClass]
}
}
@KoinInternalApi
internal fun getViewModelKey(qualifier: Qualifier? = null, key: String? = null, className: String? = null): String? {
return when {
key != null -> key
qualifier != null -> qualifier.value + (className?.let { "_$className" } ?: "")
else -> null
}
}
class KoinViewModelFactory(
private val kClass: KClass,
private val scope: Scope,
private val qualifier: Qualifier? = null,
private val params: ParametersDefinition? = null
) : ViewModelProvider.Factory {
//TODO Should handle Extras/Bundle injection here (see Android side)
override fun create(modelClass: KClass, extras: CreationExtras): T {
return scope.get(kClass, qualifier,params)
}
}
/**
* Resolve ViewModel instance
*
* @param qualifier
* @param parameters
*
* @author Arnaud Giuliani
*/
@Composable
fun defaultExtras(viewModelStoreOwner: ViewModelStoreOwner): CreationExtras = when {
viewModelStoreOwner is HasDefaultViewModelProviderFactory -> viewModelStoreOwner.defaultViewModelCreationExtras
else -> CreationExtras.Empty
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy