Migrate from Parcelable to Kotlin serialization
Potentially will be resolved automatically by adding KSerializer into rememberSaveable()
https://android-review.googlesource.com/c/platform/frameworks/support/+/3580791
UPD: Available in https://developer.android.com/jetpack/androidx/releases/compose-runtime#1.9.0-alpha01
UPD1: general usage of serialization inside rememberSaveable + custom saver already works
@Serializable
data class SomeSerializableClass(val data: Int)
internal fun <Serializable : Any> serializableSaver(
serializer: KSerializer<Serializable>,
configuration: SavedStateConfiguration = SavedStateConfiguration.DEFAULT,
): Saver<Serializable, SavedState> {
return Saver(
save = { original -> encodeToSavedState(serializer, original, configuration) },
restore = { savedState -> decodeFromSavedState(serializer, savedState, configuration) },
)
}
private val Screen by navDestination<Unit> {
val t = rememberSaveable(saver = serializableSaver(serializer())) { SomeSerializableClass(2) }
....
UPD2: rememberSerializable introduced in 1.9.*
UPD3:
it looks like we cant use @Serializable classes as Args + saveable mode directly
serializer resolved during remeberSerializable & rememberSaveable calls via reified inline fun..
We need to have serializer stored within a NavEntry/NavDestination
Option is: create(extend current) destination that holds saver's for navArgs navResult & freeArgs.. default is
saver = onSave={it}, orRestore={it}
As for serializable data types we expect to use smth like serializableSaver from UPD1
Additionl case is: we would be able to 'decode' data only after destination being resolved
UPD4: looks like it make sense to have multiple navDest functions
val Screen by simpleNavDestination == navDestination<Unit>
val Screen by navDestination<Data>
val Screen by navDestination<Data>(navArgsSaver:Saver, freeArgsSaver:Saver, navResultSaver:Saver, ...)
Done https://github.com/ComposeGears/Tiamat/pull/209