# 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)

*** ** * ** ***


```
public final class ViewModelStoreProvider
```

<br />

*** ** * ** ***

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

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

**Important:** This class prevents a child `https://developer.android.com/reference/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/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)` to mark a child `https://developer.android.com/reference/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/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearKey(kotlin.Any)` or `https://developer.android.com/reference/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/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/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearAllKeys()` to clean it up.

## Summary

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

| ### Public constructors |
|---|
| `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#ViewModelStoreProvider(androidx.lifecycle.ViewModelStoreOwner,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)( https://developer.android.com/reference/androidx/lifecycle/ViewModelStoreOwner parentOwner, https://developer.android.com/reference/java/lang/Object.html parentKey, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/savedstate/SavedState defaultArgs, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/viewmodel/CreationExtras defaultCreationExtras, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/ViewModelProvider.Factory defaultFactory )` Constructs a `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider` bound to a parent `https://developer.android.com/reference/androidx/lifecycle/ViewModelStoreOwner`. |
| `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#ViewModelStoreProvider(androidx.lifecycle.ViewModelStore,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)( https://developer.android.com/reference/androidx/lifecycle/ViewModelStore parentStore, https://developer.android.com/reference/java/lang/Object.html parentKey, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/savedstate/SavedState defaultArgs, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/viewmodel/CreationExtras defaultCreationExtras, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/ViewModelProvider.Factory defaultFactory )` |

| ### Public methods |
|---|---|
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider.ReferenceToken` | `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)(https://developer.android.com/reference/java/lang/Object.html key)` Increments the reference count for the `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` associated with the given `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)`, ensuring it is not cleared until the returned `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider.ReferenceToken` is released. |
| `final void` | `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearAllKeys()()` Triggers a cleanup pass on all managed stores. |
| `final void` | `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearKey(kotlin.Any)(https://developer.android.com/reference/java/lang/Object.html key)` Marks the `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` associated with the given `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#clearKey(kotlin.Any)` as removable. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` | `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreate(kotlin.Any)(https://developer.android.com/reference/java/lang/Object.html key)` Retrieves or creates a `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` associated with the given `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreate(kotlin.Any)`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/ViewModelStoreOwner` | `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreateOwner(kotlin.Any,androidx.savedstate.SavedStateRegistryOwner,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)( https://developer.android.com/reference/java/lang/Object.html key, https://developer.android.com/reference/androidx/savedstate/SavedStateRegistryOwner savedStateRegistryOwner, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/savedstate/SavedState defaultArgs, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/viewmodel/CreationExtras defaultCreationExtras, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/ViewModelProvider.Factory defaultFactory )` Retrieves or creates a `https://developer.android.com/reference/androidx/lifecycle/ViewModelStoreOwner` associated with the given `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreateOwner(kotlin.Any,androidx.savedstate.SavedStateRegistryOwner,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)`. |

## Public constructors

### ViewModelStoreProvider

```
public ViewModelStoreProvider(
    ViewModelStoreOwner parentOwner,
    Object parentKey,
    @NonNull SavedState defaultArgs,
    @NonNull CreationExtras defaultCreationExtras,
    @NonNull ViewModelProvider.Factory defaultFactory
)
```

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

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/lifecycle/ViewModelStoreOwner parentOwner` | The parent `https://developer.android.com/reference/androidx/lifecycle/ViewModelStoreOwner` whose `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` is used to retain child `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` instances across configuration changes, or `null` for an independent root provider. |
| `https://developer.android.com/reference/java/lang/Object.html parentKey` | A unique identifier used to scope this provider and its underlying state within the `https://developer.android.com/reference/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`. |
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/savedstate/SavedState defaultArgs` | The default `https://developer.android.com/reference/androidx/savedstate/SavedState` arguments to use for child stores. These arguments are merged with any default arguments in `https://developer.android.com/reference/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/androidx/lifecycle/viewmodel/ViewModelStoreProvider#(androidx.lifecycle.ViewModelStoreOwner,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)` takes precedence. |
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/viewmodel/CreationExtras defaultCreationExtras` | The default creation extras to use for child stores. Defaults to resolving from the `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#(androidx.lifecycle.ViewModelStoreOwner,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)`. |
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/ViewModelProvider.Factory defaultFactory` | The default factory to use for child stores. Defaults to resolving from the `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#(androidx.lifecycle.ViewModelStoreOwner,kotlin.Any,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)`. |

### ViewModelStoreProvider

```
public ViewModelStoreProvider(
    ViewModelStore parentStore,
    Object parentKey,
    @NonNull SavedState defaultArgs,
    @NonNull CreationExtras defaultCreationExtras,
    @NonNull ViewModelProvider.Factory defaultFactory
)
```

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore parentStore` | The parent `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` used to retain child `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` instances across configuration changes, or `null` for an independent root provider. |
| `https://developer.android.com/reference/java/lang/Object.html parentKey` | A unique identifier used to scope this provider and its underlying state within the `https://developer.android.com/reference/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`. |
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/savedstate/SavedState defaultArgs` | The default `https://developer.android.com/reference/androidx/savedstate/SavedState` arguments to use for child stores. These arguments are merged with any default arguments in `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#defaultCreationExtras()`. If the same key exists in both, the value from `https://developer.android.com/reference/androidx/lifecycle/viewmodel/ViewModelStoreProvider#defaultArgs()` takes precedence. |
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/viewmodel/CreationExtras defaultCreationExtras` | The default creation extras to use for child stores. |
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/ViewModelProvider.Factory defaultFactory` | The default factory to use for child stores. |

## Public methods

### acquireToken

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

```
public final @NonNull ViewModelStoreProvider.ReferenceToken acquireToken(Object key)
```

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

| Parameters |
|---|---|
| `https://developer.android.com/reference/java/lang/Object.html key` | 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/androidx/annotation/NonNull https://developer.android.com/reference/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

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

```
public final void clearAllKeys()
```

Triggers a cleanup pass on all managed stores.

Any `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` that has a reference count of zero will have its `https://developer.android.com/reference/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

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

```
public final void clearKey(Object key)
```

Marks the `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` associated with the given `https://developer.android.com/reference/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 |
|---|---|
| `https://developer.android.com/reference/java/lang/Object.html key` | The unique identifier for the child scope. Passing `null` will target the specific scope associated with the `null` key. |

### getOrCreate

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

```
public final @NonNull ViewModelStore getOrCreate(Object key)
```

Retrieves or creates a `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` associated with the given `https://developer.android.com/reference/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/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/java/lang/Object.html key` | 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/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` | The `https://developer.android.com/reference/androidx/lifecycle/ViewModelStore` tied to the provided key. |

### getOrCreateOwner

```
public final @NonNull ViewModelStoreOwner getOrCreateOwner(
    Object key,
    SavedStateRegistryOwner savedStateRegistryOwner,
    @NonNull SavedState defaultArgs,
    @NonNull CreationExtras defaultCreationExtras,
    @NonNull ViewModelProvider.Factory defaultFactory
)
```

Retrieves or creates a `https://developer.android.com/reference/androidx/lifecycle/ViewModelStoreOwner` associated with the given `https://developer.android.com/reference/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/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/androidx/lifecycle/viewmodel/ViewModelStoreProvider#acquireToken(kotlin.Any)` to protect its lifecycle.

**Saved State Support:** If a `https://developer.android.com/reference/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/androidx/lifecycle/ViewModelStoreOwner` will also implement `https://developer.android.com/reference/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/androidx/lifecycle/SavedStateHandle`. When saved state is enabled and `https://developer.android.com/reference/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/androidx/lifecycle/SavedStateViewModelFactory`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/java/lang/Object.html key` | The unique identifier for the child scope. A `null` key is valid and is treated as a distinct scope. |
| `https://developer.android.com/reference/androidx/savedstate/SavedStateRegistryOwner savedStateRegistryOwner` | An optional parent registry owner to delegate saved state operations to. If `null`, the returned owner will not support `https://developer.android.com/reference/androidx/lifecycle/SavedStateHandle`. |
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/savedstate/SavedState defaultArgs` | The default `https://developer.android.com/reference/androidx/savedstate/SavedState` arguments to use for child stores. These arguments are merged with any default arguments in `https://developer.android.com/reference/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/androidx/lifecycle/viewmodel/ViewModelStoreProvider#getOrCreateOwner(kotlin.Any,androidx.savedstate.SavedStateRegistryOwner,androidx.savedstate.SavedState,androidx.lifecycle.viewmodel.CreationExtras,androidx.lifecycle.ViewModelProvider.Factory)` takes precedence. |
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/viewmodel/CreationExtras defaultCreationExtras` | An optional override for the default `https://developer.android.com/reference/androidx/lifecycle/viewmodel/CreationExtras`. |
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/ViewModelProvider.Factory defaultFactory` | An optional override for the default `https://developer.android.com/reference/androidx/lifecycle/ViewModelProvider.Factory`. |

| Returns |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/ViewModelStoreOwner` | A scoped `https://developer.android.com/reference/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/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. |