Ofek
06/22/2023, 11:21 AMSharedViewModel in order to preserve data saved in SavedStateHandle through a flow of screens after process death, let me explain:
I have a flow of screens: A, B & C where each screen “contributes” data to a single data holder. Then the final screen, screen C takes all that data and use it.
I’ve implemented a SharedViewModel and inject it to all consumers screens via hiltNavGraphViewModel & @AssistedInject (@AssistedInject is used in order to inject the SharedViewModel into each screen’s ViewModel).
Everything works fine, I’m able to get the same SharedViewModel instance and each screen can contribute his data where finally screen C can use it (everything works, happy flow).
The issue starts with process death - I’ve tried to save the SharedViewModel data as a Parcelable with his own SavedStateInstance but as soon as I simulate process death, when the screen loads and the SharedViewModel is injected, I get null when I try to access the saved data.
I’ve attached the SharedViewModel and the Parcelable model in the thread.
Has anyone stumbled upon this behavior?Ofek
06/22/2023, 11:21 AM@HiltViewModel
class SharedViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle,
) : ViewModel() {
var data = initializeData()
set(value) {
savedStateHandle[SavedStateHandleDataKey] = value
field = value
}
private fun initializeData(): SharedData {
val savedData: SharedData? = savedStateHandle[SavedStateHandleDataKey] //Here it's null after process death
return savedStateHandle[SavedStateHandleDataKey] ?: SharedData()
}
companion object {
private const val SavedStateHandleDataKey = "data"
}
}
@Parcelize
data class SharedData(
val amount: Double = 0.0,
) : Parcelable