SavedStateHandle helps you save and restore small pieces of data in your app when the screen rotates or the app is temporarily stopped. It keeps your app's state safe without extra work.
SavedStateHandle in Android Kotlin
class MyViewModel(private val state: SavedStateHandle) : ViewModel() { fun saveData(key: String, value: String) { state.set(key, value) } fun getData(key: String): String? { return state.get<String>(key) } }
SavedStateHandle is usually passed to your ViewModel by the system.
You use set(key, value) to save and get(key) to retrieve data.
state.set("username", "Alice") val name = state.get<String>("username")
val count = state.get<Int>("clickCount") ?: 0 state.set("clickCount", count + 1)
This ViewModel saves a count number. It starts at 0 if no saved value exists. When increment is called, it adds 1 and saves it. The count stays even if the screen rotates.
class CounterViewModel(private val state: SavedStateHandle) : ViewModel() { fun getCount(): Int { return state.get<Int>("count") ?: 0 } fun increment() { val current = getCount() state.set("count", current + 1) } } // Usage in Activity (requires SavedStateViewModelFactory): // val factory = SavedStateViewModelFactory(this.application, this) // val viewModel = ViewModelProvider(this, factory).get(CounterViewModel::class.java) // println(viewModel.getCount()) // prints 0 initially // viewModel.increment() // println(viewModel.getCount()) // prints 1 after increment
SavedStateHandle works well for small, simple data like strings and numbers.
It is not meant for large data or complex objects.
Use it to improve user experience by keeping UI state consistent.
SavedStateHandle saves small data automatically during configuration changes.
Use set and get methods to store and retrieve data.
It helps keep your app state safe without extra code for saving/restoring.
Practice
What is the main purpose of SavedStateHandle in Android Kotlin?
Solution
Step 1: Understand the role of SavedStateHandle
SavedStateHandle is designed to save small pieces of data like UI state during configuration changes such as screen rotations.Step 2: Compare with other options
Options A, B, and D relate to network requests, database connections, and UI layout creation, which are not the purpose of SavedStateHandle.Final Answer:
To save and restore small UI-related data automatically during configuration changes -> Option AQuick Check:
SavedStateHandle saves UI state = C [OK]
- Confusing SavedStateHandle with database or network management
- Thinking it manages large data or files
- Assuming it creates UI layouts
Which of the following is the correct way to store a value "username" in SavedStateHandle named savedStateHandle?
?Solution
Step 1: Recall SavedStateHandle API methods
The correct method to store data isset(key, value).Step 2: Check method names in options
Only savedStateHandle.set("username", "John") usesset, others use incorrect method names.Final Answer:
savedStateHandle.set("username", "John") -> Option BQuick Check:
Use set() to store data = A [OK]
- Using put(), save(), or store() which do not exist
- Confusing with SharedPreferences methods
- Forgetting to use quotes around keys
Given the code below, what will be the output of println(savedStateHandle.get<String>("name"))?
val savedStateHandle = SavedStateHandle()
savedStateHandle.set("name", "Alice")
savedStateHandle.set("age", 30)
savedStateHandle.set("name", "Bob")Solution
Step 1: Analyze the set operations
The key "name" is first set to "Alice", then overwritten with "Bob".Step 2: Determine the value returned by get
Getting "name" returns the latest value, which is "Bob".Final Answer:
Bob -> Option CQuick Check:
Last set value returned = A [OK]
- Assuming first set value is returned
- Confusing key names
- Expecting numeric value for string key
Identify the error in the following code snippet using SavedStateHandle:
val savedStateHandle = SavedStateHandle()
savedStateHandle.set("count", 10)
val count: String = savedStateHandle.get("count") ?: "0"
println(count)Solution
Step 1: Check variable types
The value stored is Int (10), but retrieved as String without conversion.Step 2: Understand Kotlin type safety
Assigning Int to String variable causes a type mismatch error.Final Answer:
Type mismatch: trying to assign Int to String without conversion -> Option DQuick Check:
Type mismatch error = D [OK]
- Ignoring type mismatch errors
- Assuming automatic type conversion
- Thinking SavedStateHandle only stores strings
You want to save a user's score in SavedStateHandle and restore it after a configuration change. Which approach correctly ensures the score is saved and retrieved safely?
class ScoreViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
fun saveScore(score: Int) {
// What to do here?
}
fun getScore(): Int {
// What to do here?
}
}Solution
Step 1: Use correct methods to save and get data
Usesetto save andget<Int>to retrieve with a default fallback.Step 2: Validate type safety and default value
saveScore: savedStateHandle.set("score", score) getScore: savedStateHandle.get<Int>("score") ?: 0 uses correct method names and safely returns 0 if no score is saved.Final Answer:
saveScore: savedStateHandle.set("score", score) getScore: savedStateHandle.get<Int>("score") ?: 0 -> Option AQuick Check:
Use set() and get<Int>() with default = B [OK]
- Using non-existent methods like put() or save()
- Storing Int as String unnecessarily
- Not providing default value on get()
Ready to prove it?
Pass the test and this pattern moves unknown
