DEV Community

Manoj sai Challagulla
Manoj sai Challagulla

Posted on

ViewModel LifeCycle Over Navigations

When is a ViewModel Created?

Suppose you have:

class ProfileViewModel : ViewModel()

Enter fullscreen mode Exit fullscreen mode

and inside your screen:

@Composable
fun ProfileScreen(
    viewModel: ProfileViewModel = viewModel()
) {

}
Enter fullscreen mode Exit fullscreen mode

The ViewModel is not created when the app starts.

It is created when the screen first requests it.

User opens Profile Screen
          ↓
viewModel() called
          ↓
Android checks:
"Do I already have a ProfileViewModel?"
          ↓
No
          ↓
Create ProfileViewModel
Enter fullscreen mode Exit fullscreen mode

What happens during recomposition?

Suppose state changes:

Text(name)
Enter fullscreen mode Exit fullscreen mode

changes from:

Manoj
Enter fullscreen mode Exit fullscreen mode

to:

Manoj Sai
Enter fullscreen mode Exit fullscreen mode

Compose recomposes.

Many beginners think:

Screen recomposed
↓
ViewModel recreated

❌ Wrong.
Enter fullscreen mode Exit fullscreen mode

The same ViewModel instance is reused.

Screen Recompose #1
      ↓
Same ViewModel

Screen Recompose #2
      ↓
Same ViewModel

Screen Recompose #100
      ↓
Same ViewModel

This is why ViewModels survive recompositions.

Enter fullscreen mode Exit fullscreen mode

What happens during screen rotation?

Imagine:

Enter fullscreen mode Exit fullscreen mode

Portrait

Rotate

Landscape

Activity gets recreated.


Without ViewModel:

Enter fullscreen mode Exit fullscreen mode


plaintext
Data lost

With ViewModel:

Activity destroyed

New Activity created

Same ViewModel reused

That's one of the biggest reasons ViewModels exist.

## When is ViewModel Destroyed?

The ViewModel lives as long as its owner lives.

For example:

Enter fullscreen mode Exit fullscreen mode


plaintext
Profile Screen opened

ViewModel created

User stays on screen

ViewModel alive

Then:

Enter fullscreen mode Exit fullscreen mode


plaintext
User presses Back

Profile screen removed

ViewModel no longer needed

onCleared()

ViewModel destroyed


## What is onCleared()?

Before Android destroys the ViewModel it calls:

Enter fullscreen mode Exit fullscreen mode


kotlin
override fun onCleared() {
super.onCleared()
}


Think of it as:

Enter fullscreen mode Exit fullscreen mode


plaintext
"Hey ViewModel,
I'm about to destroy you.
Clean up anything you're using."


At this moment:

Enter fullscreen mode Exit fullscreen mode


kotlin
viewModelScope.cancel()


is automatically triggered.

Real Example with Navigation

Suppose:

Enter fullscreen mode Exit fullscreen mode


plaintext
HomeScreen

ProfileScreen

User opens Profile:

ProfileScreen created

ProfileViewModel created


User stays there:

Enter fullscreen mode Exit fullscreen mode


plaintext
ProfileViewModel alive

User returns to Home:

Enter fullscreen mode Exit fullscreen mode


plaintext
ProfileScreen removed from back stack

ProfileViewModel.onCleared()

ProfileViewModel destroyed


## Navigation Compose Case

Suppose:

Enter fullscreen mode Exit fullscreen mode


plaintext
Home

Profile

Settings

Enter fullscreen mode Exit fullscreen mode


plaintext

Current back stack:

Home
Profile
Settings
Enter fullscreen mode Exit fullscreen mode


plaintext

When you're on Settings:

ProfileViewModel
Enter fullscreen mode Exit fullscreen mode


plaintext

may still be alive because Profile is still in the navigation back stack.

Only when Profile is removed from the back stack:

Home
Settings
Enter fullscreen mode Exit fullscreen mode


plaintext

then:

ProfileViewModel destroyed
Complete Lifecycle


User opens screen
        ↓
Android creates ViewModel
        ↓
ViewModelScope created
        ↓
Coroutines launched
        ↓
Screen recomposes many times
        ↓
Same ViewModel reused
        ↓
User leaves screen permanently
        ↓
onCleared()
        ↓
viewModelScope cancelled
        ↓
All coroutines cancelled
        ↓
ViewModel destroyed

Enter fullscreen mode Exit fullscreen mode

This is why we say:

A ViewModel survives recompositions and configuration changes (like rotation), but it is destroyed when its owner is permanently removed and Android calls onCleared().

Top comments (0)