# ViewModelStoreProvider

Artifact: [androidx.lifecycle:lifecycle-viewmodel-savedstate](https://developer.android.com/jetpack/androidx/releases/lifecycle) [View Source](https://cs.android.com/search?q=file:androidx/lifecycle/viewmodel/ViewModelStoreProvider.kt+class:androidx.lifecycle.viewmodel.ViewModelStoreProvider) Added in [2.11.0](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.11.0)

*** ** * ** ***

Common/AllAndroid/JVM
- Cmn

  ```
  class ViewModelStoreProvider
  ```

*** ** * ** ***

Manages a set of child `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` instances scoped to a parent `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore`.

This class allows the creation of child `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` instances that survive configuration changes (retained via the parent `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore`) but can be independently cleared when no longer needed.

**Important:** This class prevents a child `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModel` from being cleared while they are still in use (e.g., during exit animations). Consumers must call `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)` to mark a child `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` as active and then call `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-auto-closeable/close.html` to release the token when finished. Calling `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearKey(kotlin.Any)` or `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearAllKeys()` will only perform the actual cleanup once all of a store's tokens have been released.

**Null parentStore:** If `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#parentStore()` is **EXPLICITLY** `null`, this creates a root provider that runs independently. It manages its own state and will not be automatically cleared by configuration changes; you must manually call `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearAllKeys()` to clean it up.

## Summary

| ### Nested types |
|---|
| `object https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider.ProviderMarkerKey` A special marker key that can be used with `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)` to manage the lifecycle of the shared state associated with a particular `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#parentKey()`. |
| `fun interface https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider.ReferenceToken : https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-auto-closeable/index.html` Represents an active hold on a specific `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore`. |

| ### Public constructors |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#ViewModelStoreProvider(androidx.lifecycle.ViewModelStoreOwner,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)( parentOwner: https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStoreOwner?, parentKey: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?, defaultArgs: https://developer.android.com/reference/kotlin/androidx/savedstate/SavedState, defaultCreationExtras: https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/CreationExtras, defaultFactory: https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelProvider.Factory )` Constructs a `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider` bound to a parent `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStoreOwner`. | Cmn |
| `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#ViewModelStoreProvider(androidx.lifecycle.ViewModelStore,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)( parentStore: https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore?, parentKey: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?, defaultArgs: https://developer.android.com/reference/kotlin/androidx/savedstate/SavedState, defaultCreationExtras: https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/CreationExtras, defaultFactory: https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelProvider.Factory )` | Cmn |

| ### Public functions |
|---|---|---|
| `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider.ReferenceToken` | `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)(key: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?)` Increments the reference count for the `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` associated with the given `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)`, ensuring it is not cleared until the returned `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider.ReferenceToken` is released. | Cmn |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearAllKeys()()` Triggers a cleanup pass on all managed stores. | Cmn |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearKey(kotlin.Any)(key: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?)` Marks the `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` associated with the given `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearKey(kotlin.Any)` as removable. | Cmn |
| `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` | `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreate(kotlin.Any)(key: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?)` Retrieves or creates a `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` associated with the given `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreate(kotlin.Any)`. | Cmn |
| `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStoreOwner` | `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreateOwner(kotlin.Any,androidx.savedstate.SavedStateRegistryOwner,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)( key: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?, savedStateRegistryOwner: https://developer.android.com/reference/kotlin/androidx/savedstate/SavedStateRegistryOwner?, defaultArgs: https://developer.android.com/reference/kotlin/androidx/savedstate/SavedState, defaultCreationExtras: https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/CreationExtras, defaultFactory: https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelProvider.Factory )` Retrieves or creates a `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStoreOwner` associated with the given `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreateOwner(kotlin.Any,androidx.savedstate.SavedStateRegistryOwner,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)`. | Cmn |

## Public constructors

### ViewModelStoreProvider

Cmn

```
ViewModelStoreProvider(
    parentOwner: ViewModelStoreOwner?,
    parentKey: Any? = null,
    defaultArgs: SavedState = savedState(),
    defaultCreationExtras: CreationExtras = parentOwner.defaultViewModelCreationExtras,
    defaultFactory: ViewModelProvider.Factory = parentOwner.defaultViewModelProviderFactory
)
```

Constructs a `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider` bound to a parent `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStoreOwner`.

| Parameters |
|---|---|
| `parentOwner: https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStoreOwner?` | The parent `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStoreOwner` whose `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` is used to retain child `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` instances across configuration changes, or `null` for an independent root provider. |
| `parentKey: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html? = null` | A unique identifier used to scope this provider and its underlying state within the `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#(androidx.lifecycle.ViewModelStoreOwner,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)`. Providers sharing the same key will share the same internal state. A `null` key is valid and acts as its own distinct shared scope. Defaults to `null`. |
| `defaultArgs: https://developer.android.com/reference/kotlin/androidx/savedstate/SavedState = savedState()` | The default `https://developer.android.com/reference/kotlin/androidx/savedstate/SavedState` arguments to use for child stores. These arguments are merged with any default arguments in `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#(androidx.lifecycle.ViewModelStoreOwner,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)`. If the same key exists in both, the value from `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#(androidx.lifecycle.ViewModelStoreOwner,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)` takes precedence. |
| `defaultCreationExtras: https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/CreationExtras = parentOwner.defaultViewModelCreationExtras` | The default creation extras to use for child stores. Defaults to resolving from the `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#(androidx.lifecycle.ViewModelStoreOwner,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)`. |
| `defaultFactory: https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelProvider.Factory = parentOwner.defaultViewModelProviderFactory` | The default factory to use for child stores. Defaults to resolving from the `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#(androidx.lifecycle.ViewModelStoreOwner,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)`. |

### ViewModelStoreProvider

Cmn

```
ViewModelStoreProvider(
    parentStore: ViewModelStore?,
    parentKey: Any? = null,
    defaultArgs: SavedState = savedState(),
    defaultCreationExtras: CreationExtras = CreationExtras.Empty,
    defaultFactory: ViewModelProvider.Factory = SavedStateViewModelFactory()
)
```

| Parameters |
|---|---|
| `parentStore: https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore?` | The parent `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` used to retain child `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` instances across configuration changes, or `null` for an independent root provider. |
| `parentKey: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html? = null` | A unique identifier used to scope this provider and its underlying state within the `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#parentStore()`. Providers sharing the same key will share the same internal state. A `null` key is valid and acts as its own distinct shared scope. Defaults to `null`. |
| `defaultArgs: https://developer.android.com/reference/kotlin/androidx/savedstate/SavedState = savedState()` | The default `https://developer.android.com/reference/kotlin/androidx/savedstate/SavedState` arguments to use for child stores. These arguments are merged with any default arguments in `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#defaultCreationExtras()`. If the same key exists in both, the value from `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#defaultArgs()` takes precedence. |
| `defaultCreationExtras: https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/CreationExtras = CreationExtras.Empty` | The default creation extras to use for child stores. |
| `defaultFactory: https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelProvider.Factory = SavedStateViewModelFactory()` | The default factory to use for child stores. |

## Public functions

### acquireToken

Cmn Added in [2.11.0](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.11.0)

```
fun acquireToken(key: Any?): ViewModelStoreProvider.ReferenceToken
```

Increments the reference count for the `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` associated with the given `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)`, ensuring it is not cleared until the returned `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider.ReferenceToken` is released.

| Parameters |
|---|---|
| `key: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?` | The unique identifier for the child scope. A `null` key is valid and is treated as a distinct scope. |

| Returns |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider.ReferenceToken` | A token that must be released via `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-auto-closeable/close.html` when the caller no longer requires the store. |

### clearAllKeys

Cmn Added in [2.11.0](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.11.0)

```
fun clearAllKeys(): Unit
```

Triggers a cleanup pass on all managed stores.

Any `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` that has a reference count of zero will have its `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore#clear()` method called and will be removed from the internal map. Stores with active references are marked as removable and will be deferred until their count reaches zero.

### clearKey

Cmn Added in [2.11.0](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.11.0)

```
fun clearKey(key: Any?): Unit
```

Marks the `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` associated with the given `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearKey(kotlin.Any)` as removable.

If the store currently has a reference count of zero, it is cleared immediately. Otherwise, the actual cleanup is deferred until all acquired tokens are released.

| Parameters |
|---|---|
| `key: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?` | The unique identifier for the child scope. Passing `null` will target the specific scope associated with the `null` key. |

### getOrCreate

Cmn Added in [2.11.0](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.11.0)

```
fun getOrCreate(key: Any?): ViewModelStore
```

Retrieves or creates a `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` associated with the given `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreate(kotlin.Any)`.

If a store with this key already exists, it is returned. If not, a new store is created. To protect this store from being prematurely cleared, you must call `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)`.

| Parameters |
|---|---|
| `key: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?` | The unique identifier for the child scope. A `null` key is valid and is treated as a distinct scope. |

| Returns |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` | The `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore` tied to the provided key. |

### getOrCreateOwner

Cmn

```
fun getOrCreateOwner(
    key: Any?,
    savedStateRegistryOwner: SavedStateRegistryOwner? = null,
    defaultArgs: SavedState = this.defaultArgs,
    defaultCreationExtras: CreationExtras = this.defaultCreationExtras,
    defaultFactory: ViewModelProvider.Factory = this.defaultFactory
): ViewModelStoreOwner
```

Retrieves or creates a `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStoreOwner` associated with the given `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreateOwner(kotlin.Any,androidx.savedstate.SavedStateRegistryOwner,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)`.

This method creates a new lightweight wrapper around the `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStore`.

**Important:** This does *not* automatically increment the reference count. If you are holding onto this owner asynchronously or across recompositions, you should call `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)` to protect its lifecycle.

**Saved State Support:** If a `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreateOwner(kotlin.Any,androidx.savedstate.SavedStateRegistryOwner,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)` is provided, the returned `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStoreOwner` will also implement `https://developer.android.com/reference/kotlin/androidx/savedstate/SavedStateRegistryOwner`, delegating state resolution to the provided owner. This is required if ViewModels within this scope depend on `https://developer.android.com/reference/kotlin/androidx/lifecycle/SavedStateHandle`. When saved state is enabled and `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreateOwner(kotlin.Any,androidx.savedstate.SavedStateRegistryOwner,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)` is not explicitly overridden, it automatically upgrades to a `https://developer.android.com/reference/kotlin/androidx/lifecycle/SavedStateViewModelFactory`.

| Parameters |
|---|---|
| `key: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?` | The unique identifier for the child scope. A `null` key is valid and is treated as a distinct scope. |
| `savedStateRegistryOwner: https://developer.android.com/reference/kotlin/androidx/savedstate/SavedStateRegistryOwner? = null` | An optional parent registry owner to delegate saved state operations to. If `null`, the returned owner will not support `https://developer.android.com/reference/kotlin/androidx/lifecycle/SavedStateHandle`. |
| `defaultArgs: https://developer.android.com/reference/kotlin/androidx/savedstate/SavedState = this.defaultArgs` | The default `https://developer.android.com/reference/kotlin/androidx/savedstate/SavedState` arguments to use for child stores. These arguments are merged with any default arguments in `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreateOwner(kotlin.Any,androidx.savedstate.SavedStateRegistryOwner,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)`. If the same key exists in both, the value from `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreateOwner(kotlin.Any,androidx.savedstate.SavedStateRegistryOwner,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)` takes precedence. |
| `defaultCreationExtras: https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/CreationExtras = this.defaultCreationExtras` | An optional override for the default `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/CreationExtras`. |
| `defaultFactory: https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelProvider.Factory = this.defaultFactory` | An optional override for the default `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelProvider.Factory`. |

| Returns |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStoreOwner` | A scoped `https://developer.android.com/reference/kotlin/androidx/lifecycle/ViewModelStoreOwner`, which optionally supports saved state. |

| Throws |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-argument-exception/index.html` | If `https://developer.android.com/reference/kotlin/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreateOwner(kotlin.Any,androidx.savedstate.SavedStateRegistryOwner,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)` is provided but its lifecycle is past the INITIALIZED or CREATED state. |