Jason Ankers
12/07/2021, 12:27 PMrememberSaveable
saves against the nav destination registry. It would be good to be able to call rememberSaveable
against a SaveableStateRegistry higher up (i.e. a parent graph). Is this possible?Desmond Teo
12/07/2021, 2:30 PMJason Ankers
12/07/2021, 2:37 PMSavedStateHandle
. rememberSaveable
is already set up perfectly for saving snapshot state so I’ve been hoping to stick with itZach Klippenstein (he/him) [MOD]
12/07/2021, 4:07 PMSaveableStateRegistry
to rememberSaveable
via composition localsJason Ankers
12/07/2021, 4:21 PMSaveableStateRegistry
belongs to the destinationZach Klippenstein (he/him) [MOD]
12/07/2021, 4:27 PMJason Ankers
12/07/2021, 4:30 PMSaveableStateHolder
above the NavHostZach Klippenstein (he/him) [MOD]
12/07/2021, 4:31 PMJason Ankers
12/07/2021, 4:32 PMIan Lake
12/07/2021, 4:44 PMJason Ankers
12/07/2021, 4:45 PMrememberSaveable
Ian Lake
12/07/2021, 5:05 PMJason Ankers
12/07/2021, 5:21 PMIan Lake
12/07/2021, 10:41 PMSaveableStateRegistry
nor any rememberSaveble
. SavedStateHandle
actually has APIs to support custom saving , which lets you write a utility method like:
fun <T : Any> SavedStateHandle.saveableMutableStateOf(
key: String,
saver: Saver<T, out Any> = autoSaver(),
init: () -> T
): MutableState<T> {
// To be honest, I'm not sure why rememberSaveable does this
// vs just have the saver of type Saver<T, Any>
@Suppress("UNCHECKED_CAST")
(saver as Saver<T, Any>)
// value is restored using the SavedStateHandle or created via [init] lambda
val value = mutableStateOf(run {
val restored = get<Bundle>(key)?.get("value")?.let {
saver.restore(it)
}
restored ?: init()
})
// Hook up saving the MutableState to the SavedStateHandle
setSavedStateProvider(key) {
val saverScope = SaverScope { true }
with (saver) {
bundleOf("value" to saverScope.save(value.value))
}
}
return value
}
Which lets you replace a by mutableStateOf()
within your ViewModel with `by savedStateHandle.saveableMutableStateOf()`:
class SavingTestViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {
var saved by savedStateHandle.saveableMutableStateOf("key") { "initialState" }
}
Saver
and SavedStateHandle
Jason Ankers
12/08/2021, 2:53 AM