diff --git a/projects/compose/koin-compose-viewmodel/build.gradle.kts b/projects/compose/koin-compose-viewmodel/build.gradle.kts index ee9de13bf..d23f51981 100644 --- a/projects/compose/koin-compose-viewmodel/build.gradle.kts +++ b/projects/compose/koin-compose-viewmodel/build.gradle.kts @@ -37,6 +37,7 @@ kotlin { sourceSets { commonMain.dependencies { api(project(":compose:koin-compose")) + api(project(":core:koin-core-viewmodel")) api(libs.jb.composeViewmodel) api(libs.jb.composeNavigation) } diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModel.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModel.kt index 6e7aacdaf..5d6f064aa 100644 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModel.kt +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModel.kt @@ -27,6 +27,8 @@ import org.koin.core.annotation.KoinInternalApi import org.koin.core.parameter.ParametersDefinition import org.koin.core.qualifier.Qualifier import org.koin.core.scope.Scope +import org.koin.viewmodel.defaultNavExtras +import org.koin.viewmodel.resolveViewModel /* Ported directly from Android side. Waiting more feedback diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModelInternals.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModelInternals.kt deleted file mode 100644 index 5d7ecd518..000000000 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModelInternals.kt +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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. - */ -@file:Suppress("DeprecatedCallableAddReplaceWith") - -package org.koin.compose.viewmodel - -import androidx.compose.runtime.Composable -import androidx.core.bundle.Bundle -import androidx.lifecycle.* -import androidx.lifecycle.viewmodel.CreationExtras -import androidx.lifecycle.viewmodel.MutableCreationExtras -import androidx.navigation.NavBackStackEntry -import androidx.savedstate.SavedStateRegistryOwner -import org.koin.core.annotation.KoinInternalApi - -/** - * Resolve ViewModel instance - * - * @param qualifier - * @param parameters - * - * @author Arnaud Giuliani - */ -@OptIn(KoinInternalApi::class) -@Composable -fun defaultNavExtras(viewModelStoreOwner: ViewModelStoreOwner): CreationExtras = when { - //TODO To be fully verified - viewModelStoreOwner is NavBackStackEntry && viewModelStoreOwner.arguments != null -> viewModelStoreOwner.arguments?.toExtras(viewModelStoreOwner) ?: CreationExtras.Empty - viewModelStoreOwner is HasDefaultViewModelProviderFactory -> viewModelStoreOwner.defaultViewModelCreationExtras - else -> CreationExtras.Empty -} - -/** - * Convert current Bundle to CreationExtras - * @param viewModelStoreOwner - */ -@KoinInternalApi -fun Bundle.toExtras(viewModelStoreOwner: ViewModelStoreOwner): CreationExtras? { - return if (keySet().isEmpty()) null - else { - runCatching { - MutableCreationExtras().also { extras -> - extras[DEFAULT_ARGS_KEY] = this - extras[VIEW_MODEL_STORE_OWNER_KEY] = viewModelStoreOwner - extras[SAVED_STATE_REGISTRY_OWNER_KEY] = viewModelStoreOwner as SavedStateRegistryOwner - } - }.getOrNull() - } -} \ No newline at end of file diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModel.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModel.kt index b448e5dfa..c57b05295 100644 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModel.kt +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModel.kt @@ -22,11 +22,12 @@ import androidx.lifecycle.* import androidx.lifecycle.viewmodel.CreationExtras import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner import org.koin.compose.currentKoinScope -import org.koin.core.annotation.KoinExperimentalAPI import org.koin.core.annotation.KoinInternalApi import org.koin.core.parameter.ParametersDefinition import org.koin.core.qualifier.Qualifier import org.koin.core.scope.Scope +import org.koin.viewmodel.defaultExtras +import org.koin.viewmodel.resolveViewModel /* Ported directly from Android side. Waiting more feedback diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModelInternals.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModelInternals.kt deleted file mode 100644 index 6178f61cd..000000000 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModelInternals.kt +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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 -} \ No newline at end of file diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ModuleExt.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ModuleExt.kt index ce20df4f9..5670cddba 100644 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ModuleExt.kt +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ModuleExt.kt @@ -32,6 +32,7 @@ import org.koin.core.qualifier.Qualifier * @param qualifier - definition qualifier * @param definition - allow definition override */ +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun Module.viewModel( qualifier: Qualifier? = null, noinline definition: Definition diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeSetExt.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeSetExt.kt index bbb1441bc..b90d14e06 100644 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeSetExt.kt +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeSetExt.kt @@ -32,6 +32,7 @@ import org.koin.dsl.ScopeDSL * @param qualifier - definition qualifier * @param definition - allow definition override */ +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun ScopeDSL.viewModel( qualifier: Qualifier? = null, noinline definition: Definition diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeViewModelOf.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeViewModelOf.kt index 684430987..fed473da4 100644 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeViewModelOf.kt +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeViewModelOf.kt @@ -43,7 +43,7 @@ import org.koin.dsl.ScopeDSL * * @see new - function operator */ - +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun ScopeDSL.viewModelOf( crossinline constructor: () -> R, noinline options: DefinitionOptions? = null, @@ -52,6 +52,7 @@ inline fun ScopeDSL.viewModelOf( /** * @see viewModelOf */ +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1) -> R, noinline options: DefinitionOptions? = null, @@ -60,6 +61,7 @@ inline fun ScopeDSL.viewModelOf( /** * @see viewModelOf */ +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2) -> R, noinline options: DefinitionOptions? = null, @@ -68,6 +70,7 @@ inline fun ScopeDSL.viewModelOf( /** * @see viewModelOf */ +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3) -> R, noinline options: DefinitionOptions? = null, @@ -76,6 +79,7 @@ inline fun ScopeDSL. /** * @see viewModelOf */ +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4) -> R, noinline options: DefinitionOptions? = null, @@ -84,6 +88,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5) -> R, noinline options: DefinitionOptions? = null, @@ -92,6 +97,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, noinline options: DefinitionOptions? = null, @@ -100,6 +106,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, noinline options: DefinitionOptions? = null, @@ -108,6 +115,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, noinline options: DefinitionOptions? = null, @@ -116,6 +124,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, noinline options: DefinitionOptions? = null, @@ -124,6 +133,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, noinline options: DefinitionOptions? = null, @@ -132,6 +142,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, noinline options: DefinitionOptions? = null, @@ -140,6 +151,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, noinline options: DefinitionOptions? = null, @@ -148,6 +160,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, noinline options: DefinitionOptions? = null, @@ -156,6 +169,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, noinline options: DefinitionOptions? = null, @@ -164,6 +178,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, noinline options: DefinitionOptions? = null, @@ -172,6 +187,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, noinline options: DefinitionOptions? = null, @@ -180,6 +196,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, noinline options: DefinitionOptions? = null, @@ -188,6 +205,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, noinline options: DefinitionOptions? = null, @@ -196,6 +214,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, noinline options: DefinitionOptions? = null, @@ -204,6 +223,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, noinline options: DefinitionOptions? = null, @@ -212,6 +232,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21) -> R, noinline options: DefinitionOptions? = null, @@ -220,6 +241,7 @@ inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22) -> R, noinline options: DefinitionOptions? = null, diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ViewModelOf.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ViewModelOf.kt index db765bf2f..3233ba235 100644 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ViewModelOf.kt +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ViewModelOf.kt @@ -43,6 +43,7 @@ import org.koin.core.module.dsl.onOptions * * @see new */ +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun Module.viewModelOf( crossinline constructor: () -> R, noinline options: DefinitionOptions? = null, @@ -51,6 +52,7 @@ inline fun Module.viewModelOf( /** * @see viewModelOf */ +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun Module.viewModelOf( crossinline constructor: (T1) -> R, noinline options: DefinitionOptions? = null, @@ -59,6 +61,7 @@ inline fun Module.viewModelOf( /** * @see viewModelOf */ +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun Module.viewModelOf( crossinline constructor: (T1, T2) -> R, noinline options: DefinitionOptions? = null, @@ -67,6 +70,7 @@ inline fun Module.viewModelOf( /** * @see viewModelOf */ +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3) -> R, noinline options: DefinitionOptions? = null, @@ -75,6 +79,7 @@ inline fun Module.vi /** * @see viewModelOf */ +@Deprecated("use org.koin.viewmodel.dsl", ReplaceWith(expression = "viewModel", imports = ["org.koin.compose.dsl"])) inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4) -> R, noinline options: DefinitionOptions? = null, @@ -83,6 +88,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5) -> R, noinline options: DefinitionOptions? = null, @@ -91,6 +97,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, noinline options: DefinitionOptions? = null, @@ -99,6 +106,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, noinline options: DefinitionOptions? = null, @@ -107,6 +115,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, noinline options: DefinitionOptions? = null, @@ -115,6 +124,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, noinline options: DefinitionOptions? = null, @@ -123,6 +133,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, noinline options: DefinitionOptions? = null, @@ -131,6 +142,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, noinline options: DefinitionOptions? = null, @@ -139,6 +151,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, noinline options: DefinitionOptions? = null, @@ -147,6 +160,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, noinline options: DefinitionOptions? = null, @@ -155,6 +169,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, noinline options: DefinitionOptions? = null, @@ -163,6 +178,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, noinline options: DefinitionOptions? = null, @@ -171,6 +187,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, noinline options: DefinitionOptions? = null, @@ -179,6 +196,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, noinline options: DefinitionOptions? = null, @@ -187,6 +205,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, noinline options: DefinitionOptions? = null, @@ -195,6 +214,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, noinline options: DefinitionOptions? = null, @@ -203,6 +223,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, noinline options: DefinitionOptions? = null, @@ -211,6 +232,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21) -> R, noinline options: DefinitionOptions? = null, @@ -219,6 +241,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22) -> R, noinline options: DefinitionOptions? = null, diff --git a/projects/core/koin-core-viewmodel/build.gradle.kts b/projects/core/koin-core-viewmodel/build.gradle.kts index 58b80cd70..8add298a8 100644 --- a/projects/core/koin-core-viewmodel/build.gradle.kts +++ b/projects/core/koin-core-viewmodel/build.gradle.kts @@ -39,6 +39,7 @@ kotlin { api(libs.jb.lifecycleViewmodelSavedState) api(libs.jb.bundle) api(libs.jb.savedstate) + api(libs.jb.navigation) } } } diff --git a/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/factory/BundleExt.kt b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/BundleExt.kt similarity index 64% rename from projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/factory/BundleExt.kt rename to projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/BundleExt.kt index 3153fc1aa..fd0744a21 100644 --- a/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/factory/BundleExt.kt +++ b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/BundleExt.kt @@ -1,20 +1,4 @@ -///* -// * Copyright 2017-2023 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.viewmodel.factory +package org.koin.viewmodel import androidx.core.bundle.Bundle import androidx.lifecycle.DEFAULT_ARGS_KEY @@ -26,7 +10,6 @@ import androidx.lifecycle.viewmodel.MutableCreationExtras import androidx.savedstate.SavedStateRegistryOwner import org.koin.core.annotation.KoinInternalApi - /** * Scope extensions to help for ViewModel * diff --git a/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/CreationExtrasExt.kt b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/CreationExtrasExt.kt new file mode 100644 index 000000000..11c01715d --- /dev/null +++ b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/CreationExtrasExt.kt @@ -0,0 +1,19 @@ +package org.koin.viewmodel + +import androidx.lifecycle.HasDefaultViewModelProviderFactory +import androidx.lifecycle.ViewModelStoreOwner +import androidx.lifecycle.viewmodel.CreationExtras +import androidx.navigation.NavBackStackEntry +import org.koin.core.annotation.KoinInternalApi + +fun defaultExtras(viewModelStoreOwner: ViewModelStoreOwner): CreationExtras = when { + viewModelStoreOwner is HasDefaultViewModelProviderFactory -> viewModelStoreOwner.defaultViewModelCreationExtras + else -> CreationExtras.Empty +} + +@OptIn(KoinInternalApi::class) +fun defaultNavExtras(viewModelStoreOwner: ViewModelStoreOwner): CreationExtras = when { + viewModelStoreOwner is NavBackStackEntry && viewModelStoreOwner.arguments != null -> viewModelStoreOwner.arguments?.toExtras(viewModelStoreOwner) ?: CreationExtras.Empty + viewModelStoreOwner is HasDefaultViewModelProviderFactory -> viewModelStoreOwner.defaultViewModelCreationExtras + else -> CreationExtras.Empty +} \ No newline at end of file diff --git a/projects/gradle/libs.versions.toml b/projects/gradle/libs.versions.toml index d214a9a9f..86ce2f4d0 100644 --- a/projects/gradle/libs.versions.toml +++ b/projects/gradle/libs.versions.toml @@ -72,6 +72,7 @@ jb-lifecycleViewmodel = { module = "org.jetbrains.androidx.lifecycle:lifecycle-v jb-lifecycleViewmodelSavedState = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate", version.ref = "composeLifecycle" } jb-bundle = { module = "org.jetbrains.androidx.core:core-bundle", version.ref = "jbCoreBundle" } jb-savedstate = { module = "org.jetbrains.androidx.savedstate:savedstate", version.ref = "jbSavedState" } +jb-navigation = { module = "org.jetbrains.androidx.navigation:navigation-common", version.ref = "composeNavigation" } androidx-composeRuntime = { module = "androidx.compose.runtime:runtime", version.ref = "composeJetpackRuntime" } androidx-composeViewModel = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" } androidx-composeNavigation = { module = "androidx.navigation:navigation-compose", version.ref = "androidx-navigation" }