74 lines
2.5 KiB
Markdown
74 lines
2.5 KiB
Markdown
# ScreenModel
|
|
|
|
|
|
|
|
!!! success
|
|
The ScreenModel API is a part of the module`cafe.adriel.voyager:voyager-screenmodel` (see [Setup](../setup.md)).
|
|
|
|
`ScreenModel` is just like a [ViewModel](../android-viewmodel/): designed to store and manage UI-related data in a lifecycle conscious way. It also allows data to survive configuration changes such as screen rotations.
|
|
|
|
Unlike `ViewModel`, `ScreenModel` is just an interface. It's also Android independent and doesn't requires an `Activity` or `Fragment` to work.
|
|
|
|
```kotlin
|
|
class HomeScreenModel : ScreenModel {
|
|
|
|
// Optional
|
|
override fun onDispose() {
|
|
// ...
|
|
}
|
|
}
|
|
```
|
|
|
|
!!! info
|
|
`ScreenModel` is integrated with [Coroutines](coroutines-integration.md), [RxJava](rxjava-integration.md), [LiveData](livedata-integration.md), [Koin](koin-integration.md), [Kodein](kodein-integration.md) and [Hit](hilt-integration.md)!
|
|
|
|
By design, it's only possible to create a `ScreenModel` instance inside a `Screen`. Call `rememberScreenModel` and provide a factory lambda.
|
|
|
|
```kotlin
|
|
class HomeScreen : Screen {
|
|
|
|
@Composable
|
|
override fun Content() {
|
|
val screenModel = rememberScreenModel { HomeScreenModel() }
|
|
// ...
|
|
}
|
|
}
|
|
```
|
|
|
|
If you need to have multiple instances of the same `ScreenModel` for the same `Screen`, add a tag to differentiate them.
|
|
|
|
```kotlin
|
|
val screenModel = rememberScreenModel(tag = "CUSTOM_TAG") { HomeScreenModel() }
|
|
```
|
|
|
|
### Sample
|
|
|
|
.gif>)
|
|
|
|
!!! info
|
|
Source code [here](https://github.com/adrielcafe/voyager/tree/main/samples/android/src/main/java/cafe/adriel/voyager/sample/screenModel).
|
|
|
|
|
|
### Navigator scoped ScreenModel
|
|
|
|
!!! success
|
|
The`rememberNavigatorScreenModel` are part of the navigator library.
|
|
|
|
Starting from [`1.0.0rc08`](https://github.com/adrielcafe/voyager/releases/tag/1.0.0-rc08) by using the new Navigator extension called `rememberNavigatorScreenModel` is possible to have a ScreenModel that is shared cross all Screens from a Navigator and when the Navigator leaves the Composition the ScreenModel is disposed.
|
|
|
|
```kotlin
|
|
class HomeScreen : Screen {
|
|
|
|
@Composable
|
|
override fun Content() {
|
|
val navigator = LocalNavigator.currentOrThrow
|
|
val screenModel = navigator.rememberNavigatorScreenModel { HomeScreenModel() }
|
|
// ...
|
|
}
|
|
}
|
|
```
|
|
|
|
!!! info
|
|
Each DI library we provide a extension out of the box it is also provided support for Navigator scoped ScreenModel. See [Koin](koin-integration.md), [Kodein](kodein-integration.md) and [Hit](hilt-integration.md)!
|
|
|