diff --git a/examples/androidx-samples/src/main/java/org/koin/sample/sandbox/di/AppModule.kt b/examples/androidx-samples/src/main/java/org/koin/sample/sandbox/di/AppModule.kt index 0f657be43..afb6cb194 100644 --- a/examples/androidx-samples/src/main/java/org/koin/sample/sandbox/di/AppModule.kt +++ b/examples/androidx-samples/src/main/java/org/koin/sample/sandbox/di/AppModule.kt @@ -1,8 +1,9 @@ package org.koin.sample.sandbox.di import org.koin.androidx.fragment.dsl.fragmentOf -import org.koin.androidx.viewmodel.dsl.viewModel -import org.koin.androidx.viewmodel.dsl.viewModelOf +// 4.0 deprecations +//import org.koin.androidx.viewmodel.dsl.viewModel +//import org.koin.androidx.viewmodel.dsl.viewModelOf import org.koin.androidx.workmanager.dsl.workerOf import org.koin.core.module.dsl.* import org.koin.core.module.includes diff --git a/projects/android/koin-android-compat/src/main/java/org/koin/android/compat/GetViewModelCompat.kt b/projects/android/koin-android-compat/src/main/java/org/koin/android/compat/GetViewModelCompat.kt index 62bd05431..14b6a8455 100644 --- a/projects/android/koin-android-compat/src/main/java/org/koin/android/compat/GetViewModelCompat.kt +++ b/projects/android/koin-android-compat/src/main/java/org/koin/android/compat/GetViewModelCompat.kt @@ -22,6 +22,7 @@ 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.resolveViewModel @OptIn(KoinInternalApi::class) // TODO - scope is not used for ViewModel creation. This will fallback to root scope @@ -34,4 +35,4 @@ fun resolveViewModelCompat( qualifier: Qualifier? = null, scope: Scope, parameters: ParametersDefinition? = null, -): T = org.koin.androidx.viewmodel.resolveViewModel(vmClass.kotlin, viewModelStore, key, extras, qualifier, scope, parameters) \ No newline at end of file +): T = resolveViewModel(vmClass.kotlin, viewModelStore, key, extras, qualifier, scope, parameters) \ No newline at end of file diff --git a/projects/android/koin-android/build.gradle.kts b/projects/android/koin-android/build.gradle.kts index 7e98c7108..cf553b1ff 100644 --- a/projects/android/koin-android/build.gradle.kts +++ b/projects/android/koin-android/build.gradle.kts @@ -32,6 +32,7 @@ tasks.withType().all { dependencies { api(project(":core:koin-core")) + api(project(":core:koin-core-viewmodel")) api(libs.android.appcompat) api(libs.android.activity) api(libs.android.fragment) diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ModuleExt.kt b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ModuleExt.kt index 568e1df67..8185f00be 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ModuleExt.kt +++ b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ModuleExt.kt @@ -32,6 +32,7 @@ import org.koin.core.qualifier.Qualifier * @param qualifier - definition qualifier * @param definition - allow definition override */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun Module.viewModel( qualifier: Qualifier? = null, noinline definition: Definition diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ScopeSetExt.kt b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ScopeSetExt.kt index 56770e3c0..ba835b2ad 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ScopeSetExt.kt +++ b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ScopeSetExt.kt @@ -31,7 +31,9 @@ import org.koin.dsl.ScopeDSL * * @param qualifier - definition qualifier * @param definition - allow definition override + * */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun ScopeDSL.viewModel( qualifier: Qualifier? = null, noinline definition: Definition diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ScopeViewModelOf.kt b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ScopeViewModelOf.kt index 1c3534d80..75b9e68cd 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ScopeViewModelOf.kt +++ b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ScopeViewModelOf.kt @@ -43,7 +43,7 @@ import org.koin.dsl.ScopeDSL * * @see new - function operator */ - +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun ScopeDSL.viewModelOf( crossinline constructor: () -> R, noinline options: DefinitionOptions? = null, @@ -52,6 +52,7 @@ inline fun ScopeDSL.viewModelOf( /** * @see viewModelOf */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1) -> R, noinline options: DefinitionOptions? = null, @@ -60,6 +61,7 @@ inline fun ScopeDSL.viewModelOf( /** * @see viewModelOf */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.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("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.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("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.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/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ViewModelOf.kt b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ViewModelOf.kt index 32133fe51..dffc783f0 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ViewModelOf.kt +++ b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/dsl/ViewModelOf.kt @@ -42,6 +42,7 @@ import org.koin.core.module.dsl.onOptions * * @see new */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun Module.viewModelOf( crossinline constructor: () -> R, noinline options: DefinitionOptions? = null, @@ -50,6 +51,7 @@ inline fun Module.viewModelOf( /** * @see viewModelOf */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun Module.viewModelOf( crossinline constructor: (T1) -> R, noinline options: DefinitionOptions? = null, @@ -58,6 +60,7 @@ inline fun Module.viewModelOf( /** * @see viewModelOf */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun Module.viewModelOf( crossinline constructor: (T1, T2) -> R, noinline options: DefinitionOptions? = null, @@ -66,6 +69,7 @@ inline fun Module.viewModelOf( /** * @see viewModelOf */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3) -> R, noinline options: DefinitionOptions? = null, @@ -74,6 +78,7 @@ inline fun Module.vi /** * @see viewModelOf */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4) -> R, noinline options: DefinitionOptions? = null, @@ -82,6 +87,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5) -> R, noinline options: DefinitionOptions? = null, @@ -90,6 +96,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, noinline options: DefinitionOptions? = null, @@ -98,6 +105,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, noinline options: DefinitionOptions? = null, @@ -106,6 +114,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, noinline options: DefinitionOptions? = null, @@ -114,6 +123,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, noinline options: DefinitionOptions? = null, @@ -122,6 +132,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, noinline options: DefinitionOptions? = null, @@ -130,6 +141,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, noinline options: DefinitionOptions? = null, @@ -138,6 +150,7 @@ inline fun Module.viewModelOf( crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, noinline options: DefinitionOptions? = null, @@ -146,6 +159,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, @@ -154,6 +168,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, @@ -162,6 +177,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, @@ -170,6 +186,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, @@ -178,6 +195,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, @@ -186,6 +204,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, @@ -194,6 +213,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, @@ -202,6 +222,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, @@ -210,6 +231,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, @@ -218,6 +240,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/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ActivityVM.kt b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ActivityVM.kt index 5b8930cd1..7d2004472 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ActivityVM.kt +++ b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ActivityVM.kt @@ -20,10 +20,10 @@ import androidx.annotation.MainThread import androidx.lifecycle.ViewModel import androidx.lifecycle.viewmodel.CreationExtras import org.koin.android.ext.android.getKoinScope -import org.koin.androidx.viewmodel.resolveViewModel import org.koin.core.annotation.KoinInternalApi import org.koin.core.parameter.ParametersHolder import org.koin.core.qualifier.Qualifier +import org.koin.viewmodel.resolveViewModel /** * ViewModel API from ComponentActivity diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/FragmentActivityVM.kt b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/FragmentActivityVM.kt index 8363d7548..92c123874 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/FragmentActivityVM.kt +++ b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/FragmentActivityVM.kt @@ -22,10 +22,10 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelStoreOwner import androidx.lifecycle.viewmodel.CreationExtras import org.koin.android.ext.android.getKoinScope -import org.koin.androidx.viewmodel.resolveViewModel import org.koin.core.annotation.KoinInternalApi import org.koin.core.parameter.ParametersHolder import org.koin.core.qualifier.Qualifier +import org.koin.viewmodel.resolveViewModel /** * ViewModel instance shared with parent Activity diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/FragmentVM.kt b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/FragmentVM.kt index b3329d68c..eb890d693 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/FragmentVM.kt +++ b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/FragmentVM.kt @@ -21,10 +21,10 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelStoreOwner import androidx.lifecycle.viewmodel.CreationExtras import org.koin.android.ext.android.getKoinScope -import org.koin.androidx.viewmodel.resolveViewModel import org.koin.core.annotation.KoinInternalApi import org.koin.core.parameter.ParametersHolder import org.koin.core.qualifier.Qualifier +import org.koin.viewmodel.resolveViewModel /** * ViewModel API from Fragment diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ViewModelLazy.kt b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ViewModelLazy.kt index 01e175743..ae3b3202c 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ViewModelLazy.kt +++ b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ViewModelLazy.kt @@ -9,11 +9,12 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelStoreOwner import androidx.lifecycle.viewmodel.CreationExtras import org.koin.android.ext.android.getKoinScope -import org.koin.androidx.viewmodel.resolveViewModel -import org.koin.androidx.viewmodel.scope.BundleDefinition import org.koin.core.annotation.KoinInternalApi import org.koin.core.parameter.ParametersDefinition import org.koin.core.qualifier.Qualifier +import org.koin.viewmodel.BundleDefinition +import org.koin.viewmodel.resolveViewModel +import org.koin.viewmodel.toExtras import kotlin.reflect.KClass @OptIn(KoinInternalApi::class) diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/scope/ScopeExt.kt b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/scope/ScopeExt.kt deleted file mode 100644 index a2cabc06c..000000000 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/scope/ScopeExt.kt +++ /dev/null @@ -1,31 +0,0 @@ -///* -// * 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.androidx.viewmodel.scope - -import android.os.Bundle - - -/** - * Scope extensions to help for ViewModel - * - * @author Arnaud Giuliani - */ -//TODO Replace with CreationExtras API -fun emptyState(): BundleDefinition = { Bundle() } - -//TODO Replace with CreationExtras API -typealias BundleDefinition = () -> Bundle \ No newline at end of file diff --git a/projects/android/koin-android/src/test/java/org/koin/test/android/viewmodel/ViewModelKeyTest.kt b/projects/android/koin-android/src/test/java/org/koin/test/android/viewmodel/ViewModelKeyTest.kt index 03236dd24..fa62a1445 100644 --- a/projects/android/koin-android/src/test/java/org/koin/test/android/viewmodel/ViewModelKeyTest.kt +++ b/projects/android/koin-android/src/test/java/org/koin/test/android/viewmodel/ViewModelKeyTest.kt @@ -1,9 +1,9 @@ package org.koin.test.android.viewmodel import org.junit.Test -import org.koin.androidx.viewmodel.getViewModelKey import org.koin.core.annotation.KoinInternalApi import org.koin.core.qualifier.StringQualifier +import org.koin.viewmodel.getViewModelKey import kotlin.test.assertEquals class ViewModelKeyTest { diff --git a/projects/android/koin-android/src/test/java/org/koin/test/androidx/viewmodel/GetViewModelTest.kt b/projects/android/koin-android/src/test/java/org/koin/test/androidx/viewmodel/GetViewModelTest.kt index b64403669..fdc612b42 100644 --- a/projects/android/koin-android/src/test/java/org/koin/test/androidx/viewmodel/GetViewModelTest.kt +++ b/projects/android/koin-android/src/test/java/org/koin/test/androidx/viewmodel/GetViewModelTest.kt @@ -8,12 +8,11 @@ import io.mockk.mockk import io.mockk.verify import org.junit.Assert.assertNotNull import org.junit.Test -import org.koin.androidx.viewmodel.getViewModelKey -import org.koin.androidx.viewmodel.resolveViewModel import org.koin.core.annotation.KoinInternalApi import org.koin.core.qualifier.Qualifier import org.koin.core.scope.Scope import org.koin.dsl.koinApplication +import org.koin.viewmodel.resolveViewModel @KoinInternalApi class GetViewModelTest { @@ -105,7 +104,7 @@ class GetViewModelTest { ) assertNotNull(viewModel) - verify { viewModelStore[qualifierValue+"_"+classToTest.java.canonicalName] } + verify { viewModelStore[qualifierValue+"_"+classToTest.qualifiedName] } } companion object { diff --git a/projects/bom/koin-bom/build.gradle.kts b/projects/bom/koin-bom/build.gradle.kts index 913796c81..f26268ca5 100644 --- a/projects/bom/koin-bom/build.gradle.kts +++ b/projects/bom/koin-bom/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { constraints { api(project(":core:koin-core")) api(project(":core:koin-core-coroutines")) + api(project(":core:koin-core-viewmodel")) api(project(":core:koin-test")) api(project(":core:koin-test-junit4")) api(project(":core:koin-test-junit5")) @@ -26,6 +27,7 @@ dependencies { api(project(":android:koin-androidx-workmanager")) api(project(":compose:koin-compose")) + api(project(":compose:koin-compose-viewmodel")) api(project(":compose:koin-androidx-compose")) api(project(":compose:koin-androidx-compose-navigation")) } diff --git a/projects/compose/koin-androidx-compose-navigation/src/main/java/org/koin/androidx/compose/navigation/NavViewModel.kt b/projects/compose/koin-androidx-compose-navigation/src/main/java/org/koin/androidx/compose/navigation/NavViewModel.kt index 36f4606c4..687ce5000 100644 --- a/projects/compose/koin-androidx-compose-navigation/src/main/java/org/koin/androidx/compose/navigation/NavViewModel.kt +++ b/projects/compose/koin-androidx-compose-navigation/src/main/java/org/koin/androidx/compose/navigation/NavViewModel.kt @@ -21,13 +21,13 @@ import androidx.compose.runtime.Composable import androidx.lifecycle.* import androidx.lifecycle.viewmodel.CreationExtras import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner -import org.koin.androidx.viewmodel.resolveViewModel -import org.koin.compose.LocalKoinScope import org.koin.compose.currentKoinScope 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 /** * Resolve ViewModel instance with Navigation NavBackStackEntry as extras parameters diff --git a/projects/compose/koin-androidx-compose-navigation/src/main/java/org/koin/androidx/compose/navigation/NavViewModelInternals.kt b/projects/compose/koin-androidx-compose-navigation/src/main/java/org/koin/androidx/compose/navigation/NavViewModelInternals.kt deleted file mode 100644 index 14de23c60..000000000 --- a/projects/compose/koin-androidx-compose-navigation/src/main/java/org/koin/androidx/compose/navigation/NavViewModelInternals.kt +++ /dev/null @@ -1,42 +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.androidx.compose.navigation - -import androidx.compose.runtime.Composable -import androidx.lifecycle.* -import androidx.lifecycle.viewmodel.CreationExtras -import androidx.navigation.NavBackStackEntry -import org.koin.androidx.viewmodel.ext.android.toExtras -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 -} \ No newline at end of file diff --git a/projects/compose/koin-androidx-compose/src/main/java/org/koin/androidx/compose/ViewModel.kt b/projects/compose/koin-androidx-compose/src/main/java/org/koin/androidx/compose/ViewModel.kt index 326480a8d..5eed9a712 100644 --- a/projects/compose/koin-androidx-compose/src/main/java/org/koin/androidx/compose/ViewModel.kt +++ b/projects/compose/koin-androidx-compose/src/main/java/org/koin/androidx/compose/ViewModel.kt @@ -21,12 +21,13 @@ import androidx.compose.runtime.Composable import androidx.lifecycle.* import androidx.lifecycle.viewmodel.CreationExtras import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner -import org.koin.androidx.viewmodel.resolveViewModel import org.koin.compose.currentKoinScope 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 /** * Resolve ViewModel instance diff --git a/projects/compose/koin-androidx-compose/src/main/java/org/koin/androidx/compose/ViewModelInternals.kt b/projects/compose/koin-androidx-compose/src/main/java/org/koin/androidx/compose/ViewModelInternals.kt deleted file mode 100644 index 85778257a..000000000 --- a/projects/compose/koin-androidx-compose/src/main/java/org/koin/androidx/compose/ViewModelInternals.kt +++ /dev/null @@ -1,36 +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.androidx.compose - -import androidx.compose.runtime.Composable -import androidx.lifecycle.* -import androidx.lifecycle.viewmodel.CreationExtras - -/** - * 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/build.gradle.kts b/projects/compose/koin-compose-viewmodel/build.gradle.kts index 3fe1e5764..d23f51981 100644 --- a/projects/compose/koin-compose-viewmodel/build.gradle.kts +++ b/projects/compose/koin-compose-viewmodel/build.gradle.kts @@ -37,8 +37,9 @@ kotlin { sourceSets { commonMain.dependencies { api(project(":compose:koin-compose")) - api(libs.compose.viewmodel) - api(libs.compose.navigation) + 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..e30730f31 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("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.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..1967f47f5 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("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.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..b8903105b 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("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun ScopeDSL.viewModelOf( crossinline constructor: () -> R, noinline options: DefinitionOptions? = null, @@ -52,6 +52,7 @@ inline fun ScopeDSL.viewModelOf( /** * @see viewModelOf */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun ScopeDSL.viewModelOf( crossinline constructor: (T1) -> R, noinline options: DefinitionOptions? = null, @@ -60,6 +61,7 @@ inline fun ScopeDSL.viewModelOf( /** * @see viewModelOf */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.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("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.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("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.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..0647c9dbb 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("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun Module.viewModelOf( crossinline constructor: () -> R, noinline options: DefinitionOptions? = null, @@ -51,6 +52,7 @@ inline fun Module.viewModelOf( /** * @see viewModelOf */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.dsl.*") inline fun Module.viewModelOf( crossinline constructor: (T1) -> R, noinline options: DefinitionOptions? = null, @@ -59,6 +61,7 @@ inline fun Module.viewModelOf( /** * @see viewModelOf */ +@Deprecated("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.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("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.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("Moved ViewModel DSL package. Remove old imports and use org.koin.core.module.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/compose/koin-compose/build.gradle.kts b/projects/compose/koin-compose/build.gradle.kts index 450270351..931e84a63 100644 --- a/projects/compose/koin-compose/build.gradle.kts +++ b/projects/compose/koin-compose/build.gradle.kts @@ -37,7 +37,7 @@ kotlin { sourceSets { commonMain.dependencies { api(project(":core:koin-core")) - api(libs.compose.jb) + api(libs.jb.composeRuntime) } } } diff --git a/projects/core/koin-core-viewmodel/build.gradle.kts b/projects/core/koin-core-viewmodel/build.gradle.kts new file mode 100644 index 000000000..8add298a8 --- /dev/null +++ b/projects/core/koin-core-viewmodel/build.gradle.kts @@ -0,0 +1,68 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + alias(libs.plugins.kotlinMultiplatform) +} + +val koinVersion: String by project +version = koinVersion + +kotlin { + jvmToolchain(1_8) + jvm { + withJava() + } + + js(IR) { + nodejs() + browser() + binaries.executable() + } + + wasmJs { + binaries.executable() + nodejs() + } + + iosX64() + iosArm64() + iosSimulatorArm64() + macosX64() + macosArm64() + + sourceSets { + commonMain.dependencies { + api(project(":core:koin-core")) + api(libs.jb.lifecycleViewmodel) + api(libs.jb.lifecycleViewmodelSavedState) + api(libs.jb.bundle) + api(libs.jb.savedstate) + api(libs.jb.navigation) + } + } +} + +tasks.withType().all { + kotlinOptions { + jvmTarget = "11" + } +} + +rootProject.the().apply { + nodeVersion = "21.0.0-v8-canary202309143a48826a08" + nodeDownloadBaseUrl = "https://nodejs.org/download/v8-canary" +} + +tasks.withType().all { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_1_8) + } +} + +tasks.withType().configureEach { + args.add("--ignore-engines") +} + +apply(from = file("../../gradle/publish.gradle.kts")) diff --git a/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ModuleExt.kt b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ModuleExt.kt new file mode 100644 index 000000000..b2f5e4aa2 --- /dev/null +++ b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ModuleExt.kt @@ -0,0 +1,38 @@ +/* + * 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.core.module.dsl + +import androidx.lifecycle.ViewModel +import org.koin.core.definition.Definition +import org.koin.core.definition.KoinDefinition +import org.koin.core.module.Module +import org.koin.core.qualifier.Qualifier + +/** + * ViewModel DSL Extension + * Allow to declare a ViewModel - be later inject into Activity/Fragment with dedicated injector + * + * @author Arnaud Giuliani + * + * @param qualifier - definition qualifier + * @param definition - allow definition override + */ +inline fun Module.viewModel( + qualifier: Qualifier? = null, + noinline definition: Definition +): KoinDefinition { + return factory(qualifier, definition) +} diff --git a/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ScopeSetExt.kt b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ScopeSetExt.kt new file mode 100644 index 000000000..2b5c56a8c --- /dev/null +++ b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ScopeSetExt.kt @@ -0,0 +1,38 @@ +/* + * 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.core.module.dsl + +import androidx.lifecycle.ViewModel +import org.koin.core.definition.Definition +import org.koin.core.definition.KoinDefinition +import org.koin.core.qualifier.Qualifier +import org.koin.dsl.ScopeDSL + +/** + * ViewModel DSL Extension + * Allow to declare a ViewModel - be later inject into Activity/Fragment with dedicated injector + * + * @author Arnaud Giuliani + * + * @param qualifier - definition qualifier + * @param definition - allow definition override + */ +inline fun ScopeDSL.viewModel( + qualifier: Qualifier? = null, + noinline definition: Definition +): KoinDefinition { + return factory(qualifier, definition) +} \ No newline at end of file diff --git a/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ScopeViewModelOf.kt b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ScopeViewModelOf.kt new file mode 100644 index 000000000..8156e36db --- /dev/null +++ b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ScopeViewModelOf.kt @@ -0,0 +1,220 @@ +/* + * 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.core.module.dsl + +import androidx.lifecycle.ViewModel +import org.koin.core.definition.KoinDefinition +import org.koin.dsl.ScopeDSL + +/** + * Declare a [ScopeDSL.viewModel] definition by resolving a constructor reference for the dependency. + * The resolution is done at compile time by leveraging inline functions, no reflection is required. + * + * Example: + * ``` + * class MyViewModel : ViewModel() + * + * val myModule = module { + * viewModelOf(::MyViewModel) + * } + * ``` + * + * @author Arnaud Giuliani + * + * @see new - function operator + */ + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: () -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) \ No newline at end of file diff --git a/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ViewModelOf.kt b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ViewModelOf.kt new file mode 100644 index 000000000..8e79320b7 --- /dev/null +++ b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/core/module/dsl/ViewModelOf.kt @@ -0,0 +1,219 @@ +/* + * 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.core.module.dsl + +import androidx.lifecycle.ViewModel +import org.koin.core.definition.KoinDefinition +import org.koin.core.module.Module + +/** + * Declare a [Module.viewModel] definition by resolving a constructor reference for the dependency. + * The resolution is done at compile time by leveraging inline functions, no reflection is required. + * + * Example: + * ``` + * class MyViewModel : ViewModel() + * + * val myModule = module { + * viewModelOf(::MyViewModel) + * } + * ``` + * + * @author Arnaud Giuliani + * + * @see new + */ +inline fun Module.viewModelOf( + crossinline constructor: () -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +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, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/BundleExt.kt b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/BundleExt.kt similarity index 75% rename from projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/BundleExt.kt rename to projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/BundleExt.kt index 315f62bd4..fd0744a21 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/BundleExt.kt +++ b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/BundleExt.kt @@ -1,6 +1,6 @@ -package org.koin.androidx.viewmodel.ext.android +package org.koin.viewmodel -import android.os.Bundle +import androidx.core.bundle.Bundle import androidx.lifecycle.DEFAULT_ARGS_KEY import androidx.lifecycle.SAVED_STATE_REGISTRY_OWNER_KEY import androidx.lifecycle.VIEW_MODEL_STORE_OWNER_KEY @@ -10,6 +10,12 @@ import androidx.lifecycle.viewmodel.MutableCreationExtras import androidx.savedstate.SavedStateRegistryOwner import org.koin.core.annotation.KoinInternalApi +/** + * Scope extensions to help for ViewModel + * + * @author Arnaud Giuliani + */ + /** * Convert current Bundle to CreationExtras * @param viewModelStoreOwner @@ -26,4 +32,10 @@ fun Bundle.toExtras(viewModelStoreOwner: ViewModelStoreOwner): CreationExtras? { } }.getOrNull() } -} \ No newline at end of file +} + +//TODO Replace with CreationExtras API +fun emptyState(): BundleDefinition = { Bundle() } + +//TODO Replace with CreationExtras API +typealias BundleDefinition = () -> Bundle \ No newline at end of file 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/android/koin-android/src/main/java/org/koin/androidx/viewmodel/GetViewModel.kt b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/GetViewModel.kt similarity index 77% rename from projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/GetViewModel.kt rename to projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/GetViewModel.kt index 319104057..856dfdcdc 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/GetViewModel.kt +++ b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/GetViewModel.kt @@ -1,16 +1,18 @@ -package org.koin.androidx.viewmodel +package org.koin.viewmodel import androidx.annotation.MainThread import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStore import androidx.lifecycle.viewmodel.CreationExtras -import org.koin.androidx.viewmodel.factory.KoinViewModelFactory 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 org.koin.mp.getKClassDefaultName +import org.koin.viewmodel.factory.KoinViewModelFactory import kotlin.reflect.KClass /** @@ -34,19 +36,18 @@ fun resolveViewModel( scope: Scope, parameters: ParametersDefinition? = null, ): T { - val modelClass: Class = vmClass.java - //TODO In 3.6 - propose to resolve scope strictly from root or not val factory = KoinViewModelFactory(vmClass, scope, qualifier, parameters) - val provider = ViewModelProvider(viewModelStore, factory, extras) - val vmKey = getViewModelKey(qualifier, key, modelClass.canonicalName) + val provider = ViewModelProvider.create(viewModelStore, factory, extras) + val className = KoinPlatformTools.getClassFullNameOrNull(vmClass) ?: KoinPlatformTools.getKClassDefaultName(vmClass) + val vmKey = getViewModelKey(qualifier, key, className) return when { - vmKey != null -> provider[vmKey, modelClass] - else -> provider[modelClass] + vmKey != null -> provider[vmKey, vmClass] + else -> provider[vmClass] } } @KoinInternalApi -internal fun getViewModelKey(qualifier: Qualifier? = null, key: String? = null, className: String? = null): String? { +fun getViewModelKey(qualifier: Qualifier? = null, key: String? = null, className: String? = null): String? { return when { key != null -> key qualifier != null -> qualifier.value + (className?.let { "_$className" } ?: "") diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/parameter/AndroidParametersHolder.kt b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/factory/AndroidParametersHolder.kt similarity index 92% rename from projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/parameter/AndroidParametersHolder.kt rename to projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/factory/AndroidParametersHolder.kt index 1531492af..c0cbecb31 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/parameter/AndroidParametersHolder.kt +++ b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/factory/AndroidParametersHolder.kt @@ -1,4 +1,4 @@ -package org.koin.androidx.viewmodel.parameter +package org.koin.viewmodel.factory import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.createSavedStateHandle @@ -9,7 +9,7 @@ import kotlin.reflect.KClass class AndroidParametersHolder( initialValues: ParametersDefinition? = null, - val extras: CreationExtras, + private val extras: CreationExtras, ) : ParametersHolder(initialValues?.invoke()?.values?.toMutableList() ?: mutableListOf()) { override fun elementAt(i: Int, clazz: KClass<*>): T { diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/factory/KoinViewModelFactory.kt b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/factory/KoinViewModelFactory.kt similarity index 78% rename from projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/factory/KoinViewModelFactory.kt rename to projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/factory/KoinViewModelFactory.kt index dfa287c53..5d14789d9 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/factory/KoinViewModelFactory.kt +++ b/projects/core/koin-core-viewmodel/src/commonMain/kotlin/org/koin/viewmodel/factory/KoinViewModelFactory.kt @@ -1,9 +1,8 @@ -package org.koin.androidx.viewmodel.factory +package org.koin.viewmodel.factory import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewmodel.CreationExtras -import org.koin.androidx.viewmodel.parameter.AndroidParametersHolder import org.koin.core.parameter.ParametersDefinition import org.koin.core.qualifier.Qualifier import org.koin.core.scope.Scope @@ -20,7 +19,7 @@ class KoinViewModelFactory( private val params: ParametersDefinition? = null ) : ViewModelProvider.Factory { - override fun create(modelClass: Class, extras: CreationExtras): T { + override fun create(modelClass: KClass, extras: CreationExtras): T { val androidParams = AndroidParametersHolder(params, extras) return scope.get(kClass, qualifier) { androidParams } } diff --git a/projects/core/koin-core/src/commonMain/kotlin/org/koin/mp/KoinPlatformTools.kt b/projects/core/koin-core/src/commonMain/kotlin/org/koin/mp/KoinPlatformTools.kt index a2e593023..da5dcce1a 100644 --- a/projects/core/koin-core/src/commonMain/kotlin/org/koin/mp/KoinPlatformTools.kt +++ b/projects/core/koin-core/src/commonMain/kotlin/org/koin/mp/KoinPlatformTools.kt @@ -24,6 +24,7 @@ import kotlin.reflect.KClass expect object KoinPlatformTools { fun getStackTrace(e: Exception): String fun getClassName(kClass: KClass<*>): String + fun getClassFullNameOrNull(kClass: KClass<*>): String? fun defaultLazyMode(): LazyThreadSafetyMode fun defaultLogger(level: Level = Level.INFO): Logger fun defaultContext(): KoinContext @@ -31,5 +32,6 @@ expect object KoinPlatformTools { fun safeHashMap(): MutableMap } +fun KoinPlatformTools.getKClassDefaultName(kClass: KClass<*>) : String = "KClass@${kClass.hashCode()}" fun KoinPlatformTools.generateId() : String = uuid4().toString() diff --git a/projects/core/koin-core/src/commonTest/kotlin/org/koin/core/ParameterStackTest.kt b/projects/core/koin-core/src/commonTest/kotlin/org/koin/core/ParameterStackTest.kt index 5de507e9f..8621e73ad 100644 --- a/projects/core/koin-core/src/commonTest/kotlin/org/koin/core/ParameterStackTest.kt +++ b/projects/core/koin-core/src/commonTest/kotlin/org/koin/core/ParameterStackTest.kt @@ -7,6 +7,7 @@ import org.koin.core.parameter.parametersOf import org.koin.dsl.koinApplication import org.koin.dsl.module import org.koin.mp.KoinPlatformTools +import org.koin.mp.generateId import kotlin.test.Test import kotlin.test.assertTrue diff --git a/projects/core/koin-core/src/jsMain/kotlin/org/koin/mp/PlatformTools.kt b/projects/core/koin-core/src/jsMain/kotlin/org/koin/mp/PlatformTools.kt index a734ba90d..84dae746f 100644 --- a/projects/core/koin-core/src/jsMain/kotlin/org/koin/mp/PlatformTools.kt +++ b/projects/core/koin-core/src/jsMain/kotlin/org/koin/mp/PlatformTools.kt @@ -24,8 +24,8 @@ import kotlin.reflect.KClass actual object KoinPlatformTools { actual fun getStackTrace(e: Exception): String = e.toString() + Exception().toString().split("\n") - actual fun getClassName(kClass: KClass<*>): String = kClass.simpleName ?: "KClass@${kClass.hashCode()}" - + actual fun getClassName(kClass: KClass<*>): String = kClass.simpleName ?: getKClassDefaultName(kClass) + actual fun getClassFullNameOrNull(kClass: KClass<*>): String? = kClass.simpleName actual fun defaultLazyMode(): LazyThreadSafetyMode = LazyThreadSafetyMode.NONE actual fun defaultLogger(level: Level): Logger = PrintLogger(level) actual fun defaultContext(): KoinContext = GlobalContext diff --git a/projects/core/koin-core/src/jvmMain/kotlin/org/koin/mp/KoinPlatformTools.kt b/projects/core/koin-core/src/jvmMain/kotlin/org/koin/mp/KoinPlatformTools.kt index 5e6f073b5..a216adc97 100644 --- a/projects/core/koin-core/src/jvmMain/kotlin/org/koin/mp/KoinPlatformTools.kt +++ b/projects/core/koin-core/src/jvmMain/kotlin/org/koin/mp/KoinPlatformTools.kt @@ -28,6 +28,7 @@ import kotlin.reflect.KClass actual object KoinPlatformTools { actual fun getStackTrace(e: Exception): String = e.toString() + InstanceFactory.ERROR_SEPARATOR + e.stackTrace.takeWhile { !it.className.contains("sun.reflect") }.joinToString(InstanceFactory.ERROR_SEPARATOR) actual fun getClassName(kClass: KClass<*>): String = kClass.java.name + actual fun getClassFullNameOrNull(kClass: KClass<*>): String? = kClass.qualifiedName actual fun defaultLazyMode(): LazyThreadSafetyMode = LazyThreadSafetyMode.SYNCHRONIZED actual fun defaultLogger(level: Level): Logger = PrintLogger(level) actual fun defaultContext(): KoinContext = GlobalContext diff --git a/projects/core/koin-core/src/nativeMain/kotlin/org/koin/mp/KoinPlatformTools.kt b/projects/core/koin-core/src/nativeMain/kotlin/org/koin/mp/KoinPlatformTools.kt index e1f7b75a2..92406ed9f 100644 --- a/projects/core/koin-core/src/nativeMain/kotlin/org/koin/mp/KoinPlatformTools.kt +++ b/projects/core/koin-core/src/nativeMain/kotlin/org/koin/mp/KoinPlatformTools.kt @@ -16,8 +16,8 @@ actual object KoinPlatformTools { } actual fun getStackTrace(e: Exception): String = e.toString() + Exception().toString().split("\n") - actual fun getClassName(kClass: KClass<*>): String = kClass.qualifiedName ?: "KClass@${kClass.hashCode()}" - + actual fun getClassName(kClass: KClass<*>): String = kClass.qualifiedName ?: getKClassDefaultName(kClass) + actual fun getClassFullNameOrNull(kClass: KClass<*>): String? = kClass.qualifiedName actual fun defaultLazyMode(): LazyThreadSafetyMode = LazyThreadSafetyMode.PUBLICATION actual fun defaultLogger(level: Level): Logger = PrintLogger(level) actual fun defaultContext(): KoinContext = defaultContext diff --git a/projects/core/koin-core/src/wasmJsMain/kotlin/org/koin/mp/PlatformTools.kt b/projects/core/koin-core/src/wasmJsMain/kotlin/org/koin/mp/PlatformTools.kt index 27d443501..2ba52c3e2 100644 --- a/projects/core/koin-core/src/wasmJsMain/kotlin/org/koin/mp/PlatformTools.kt +++ b/projects/core/koin-core/src/wasmJsMain/kotlin/org/koin/mp/PlatformTools.kt @@ -24,7 +24,8 @@ import kotlin.reflect.KClass actual object KoinPlatformTools { actual fun getStackTrace(e: Exception): String = e.toString() + Exception().toString().split("\n") - actual fun getClassName(kClass: KClass<*>): String = kClass.simpleName ?: "KClass@${kClass.hashCode()}" + actual fun getClassName(kClass: KClass<*>): String = kClass.simpleName ?: getKClassDefaultName(kClass) + actual fun getClassFullNameOrNull(kClass: KClass<*>): String? = kClass.simpleName actual fun defaultLazyMode(): LazyThreadSafetyMode = LazyThreadSafetyMode.NONE actual fun defaultLogger(level: Level): Logger = PrintLogger(level) actual fun defaultContext(): KoinContext = GlobalContext diff --git a/projects/gradle/libs.versions.toml b/projects/gradle/libs.versions.toml index 4aa2f9f4e..86ce2f4d0 100644 --- a/projects/gradle/libs.versions.toml +++ b/projects/gradle/libs.versions.toml @@ -18,12 +18,15 @@ android-fragment = "1.8.1" androidx-lifecycle = "2.8.3" androidx-workmanager = "2.9.0" androidx-navigation = "2.7.7" + # Compose -# /!\ Compose compiler in gradle.properties /!\ composeJB = "1.6.11" composeLifecycle = "2.8.0" composeNavigation = "2.8.0-alpha08" composeJetpackRuntime = "1.6.8" +jbCoreBundle = "1.0.0" +jbSavedState = "1.2.0" + # Test stately = "2.0.7" junit = "4.13.2" @@ -62,9 +65,14 @@ ktor-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" } ktor-testHost = { module = "io.ktor:ktor-server-test-host", version.ref = "ktor" } ktor-slf4j = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } # Compose -compose-jb = { module = "org.jetbrains.compose.runtime:runtime", version.ref = "composeJB" } -compose-viewmodel = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "composeLifecycle" } -compose-navigation = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "composeNavigation" } +jb-composeRuntime = { module = "org.jetbrains.compose.runtime:runtime", version.ref = "composeJB" } +jb-composeViewmodel = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "composeLifecycle" } +jb-composeNavigation = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "composeNavigation" } +jb-lifecycleViewmodel = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel", version.ref = "composeLifecycle" } +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" } diff --git a/projects/settings.gradle.kts b/projects/settings.gradle.kts index b1308923d..b7704e288 100644 --- a/projects/settings.gradle.kts +++ b/projects/settings.gradle.kts @@ -18,6 +18,7 @@ include( // Core ":core:koin-core", ":core:koin-core-coroutines", + ":core:koin-core-viewmodel", ":core:koin-test", ":core:koin-test-junit4", ":core:koin-test-junit5",