diff --git a/lifecycle/lifecycle-viewmodel-compose/src/androidMain/kotlin/androidx/lifecycle/viewmodel/compose/ViewModel.android.kt b/lifecycle/lifecycle-viewmodel-compose/src/androidMain/kotlin/androidx/lifecycle/viewmodel/compose/ViewModel.android.kt index 8799851ddfec8..35eed58f07541 100644 --- a/lifecycle/lifecycle-viewmodel-compose/src/androidMain/kotlin/androidx/lifecycle/viewmodel/compose/ViewModel.android.kt +++ b/lifecycle/lifecycle-viewmodel-compose/src/androidMain/kotlin/androidx/lifecycle/viewmodel/compose/ViewModel.android.kt @@ -85,6 +85,79 @@ public fun viewModel( factory: ViewModelProvider.Factory? = null ): VM = viewModelStoreOwner.get(modelClass.kotlin, key, factory) +/** + * Returns an existing [ViewModel] or creates a new one in the given owner (usually, a fragment or + * an activity), defaulting to the owner provided by [LocalViewModelStoreOwner]. + * + * The created [ViewModel] is associated with the given [viewModelStoreOwner] and will be retained + * as long as the owner is alive (e.g. if it is an activity, until it is + * finished or process is killed). + * + * If default arguments are provided via the [CreationExtras], they will be available to the + * appropriate factory when the [ViewModel] is created. + * + * @param viewModelStoreOwner The owner of the [ViewModel] that controls the scope and lifetime + * of the returned [ViewModel]. Defaults to using [LocalViewModelStoreOwner]. + * @param key The key to use to identify the [ViewModel]. + * @param factory The [ViewModelProvider.Factory] that should be used to create the [ViewModel] + * or null if you would like to use the default factory from the [LocalViewModelStoreOwner] + * @param extras The default extras used to create the [ViewModel]. + * @return A [ViewModel] that is an instance of the given [VM] type. + * + * @sample androidx.lifecycle.viewmodel.compose.samples.CreationExtrasViewModel + */ +@Suppress("MissingJvmstatic") +@Composable +public inline fun viewModel( + viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) { + "No ViewModelStoreOwner was provided via LocalViewModelStoreOwner" + }, + key: String? = null, + factory: ViewModelProvider.Factory? = null, + extras: CreationExtras = if (viewModelStoreOwner is HasDefaultViewModelProviderFactory) { + viewModelStoreOwner.defaultViewModelCreationExtras + } else { + CreationExtras.Empty + } +): VM = viewModel(VM::class, viewModelStoreOwner, key, factory, extras) + +/** + * Returns an existing [ViewModel] or creates a new one in the scope (usually, a fragment or + * an activity) + * + * The created [ViewModel] is associated with the given [viewModelStoreOwner] and will be retained + * as long as the scope is alive (e.g. if it is an activity, until it is + * finished or process is killed). + * + * If the [viewModelStoreOwner] implements [HasDefaultViewModelProviderFactory] its default + * [CreationExtras] are the ones that will be provided to the receiver scope from the [initializer] + * + * @param viewModelStoreOwner The scope that the created [ViewModel] should be associated with. + * @param key The key to use to identify the [ViewModel]. + * @param initializer lambda used to create an instance of the ViewModel class + * @return A [ViewModel] that is an instance of the given [VM] type. + * + * @sample androidx.lifecycle.viewmodel.compose.samples.CreationExtrasViewModelInitializer + */ +@Composable +public inline fun viewModel( + viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) { + "No ViewModelStoreOwner was provided via LocalViewModelStoreOwner" + }, + key: String? = null, + noinline initializer: CreationExtras.() -> VM +): VM = viewModel( + VM::class, + viewModelStoreOwner, + key, + viewModelFactory { initializer(initializer) }, + if (viewModelStoreOwner is HasDefaultViewModelProviderFactory) { + viewModelStoreOwner.defaultViewModelCreationExtras + } else { + CreationExtras.Empty + } +) + /** * Returns an existing [ViewModel] or creates a new one in the scope (usually, a fragment or * an activity) diff --git a/lifecycle/lifecycle-viewmodel-compose/src/commonMain/kotlin/androidx/lifecycle/viewmodel/compose/ViewModel.kt b/lifecycle/lifecycle-viewmodel-compose/src/commonMain/kotlin/androidx/lifecycle/viewmodel/compose/ViewModel.kt index 965f03585719e..687c97a63b0c1 100644 --- a/lifecycle/lifecycle-viewmodel-compose/src/commonMain/kotlin/androidx/lifecycle/viewmodel/compose/ViewModel.kt +++ b/lifecycle/lifecycle-viewmodel-compose/src/commonMain/kotlin/androidx/lifecycle/viewmodel/compose/ViewModel.kt @@ -24,47 +24,13 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner import androidx.lifecycle.viewmodel.CreationExtras -import androidx.lifecycle.viewmodel.initializer -import androidx.lifecycle.viewmodel.viewModelFactory import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmName import kotlin.reflect.KClass -/** - * Returns an existing [ViewModel] or creates a new one in the given owner (usually, a fragment or - * an activity), defaulting to the owner provided by [LocalViewModelStoreOwner]. - * - * The created [ViewModel] is associated with the given [viewModelStoreOwner] and will be retained - * as long as the owner is alive (e.g. if it is an activity, until it is - * finished or process is killed). - * - * If default arguments are provided via the [CreationExtras], they will be available to the - * appropriate factory when the [ViewModel] is created. - * - * @param viewModelStoreOwner The owner of the [ViewModel] that controls the scope and lifetime - * of the returned [ViewModel]. Defaults to using [LocalViewModelStoreOwner]. - * @param key The key to use to identify the [ViewModel]. - * @param factory The [ViewModelProvider.Factory] that should be used to create the [ViewModel] - * or null if you would like to use the default factory from the [LocalViewModelStoreOwner] - * @param extras The default extras used to create the [ViewModel]. - * @return A [ViewModel] that is an instance of the given [VM] type. - * - * @sample androidx.lifecycle.viewmodel.compose.samples.CreationExtrasViewModel - */ -@Suppress("MissingJvmstatic") -@Composable -public inline fun viewModel( - viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) { - "No ViewModelStoreOwner was provided via LocalViewModelStoreOwner" - }, - key: String? = null, - factory: ViewModelProvider.Factory? = null, - extras: CreationExtras = if (viewModelStoreOwner is HasDefaultViewModelProviderFactory) { - viewModelStoreOwner.defaultViewModelCreationExtras - } else { - CreationExtras.Empty - } -): VM = viewModel(VM::class, viewModelStoreOwner, key, factory, extras) +// TODO: Move inline fun viewModel(..) to common once +// "Compilation failed: Symbol for ... is unbound" is fixed +// https://github.com/JetBrains/compose-multiplatform/issues/3147 /** * Returns an existing [ViewModel] or creates a new one in the scope (usually, a fragment or @@ -104,43 +70,6 @@ public fun viewModel( } ): VM = viewModelStoreOwner.get(modelClass, key, factory, extras) -/** - * Returns an existing [ViewModel] or creates a new one in the scope (usually, a fragment or - * an activity) - * - * The created [ViewModel] is associated with the given [viewModelStoreOwner] and will be retained - * as long as the scope is alive (e.g. if it is an activity, until it is - * finished or process is killed). - * - * If the [viewModelStoreOwner] implements [HasDefaultViewModelProviderFactory] its default - * [CreationExtras] are the ones that will be provided to the receiver scope from the [initializer] - * - * @param viewModelStoreOwner The scope that the created [ViewModel] should be associated with. - * @param key The key to use to identify the [ViewModel]. - * @param initializer lambda used to create an instance of the ViewModel class - * @return A [ViewModel] that is an instance of the given [VM] type. - * - * @sample androidx.lifecycle.viewmodel.compose.samples.CreationExtrasViewModelInitializer - */ -@Composable -public inline fun viewModel( - viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) { - "No ViewModelStoreOwner was provided via LocalViewModelStoreOwner" - }, - key: String? = null, - noinline initializer: CreationExtras.() -> VM -): VM = viewModel( - VM::class, - viewModelStoreOwner, - key, - viewModelFactory { initializer(initializer) }, - if (viewModelStoreOwner is HasDefaultViewModelProviderFactory) { - viewModelStoreOwner.defaultViewModelCreationExtras - } else { - CreationExtras.Empty - } -) - internal fun ViewModelStoreOwner.get( modelClass: KClass, key: String? = null,