Tiamat icon indicating copy to clipboard operation
Tiamat copied to clipboard

Migrate from Parcelable to Kotlin serialization

Open egorikftp opened this issue 1 year ago • 1 comments

Some Ref

egorikftp avatar Nov 14 '24 08:11 egorikftp

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

egorikftp avatar Apr 16 '25 10:04 egorikftp

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) }
    ....

vkatz avatar Jul 15 '25 22:07 vkatz

UPD2: rememberSerializable introduced in 1.9.*

vkatz avatar Jul 15 '25 22:07 vkatz

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

vkatz avatar Jul 15 '25 22:07 vkatz

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, ...)

vkatz avatar Jul 15 '25 22:07 vkatz

Done https://github.com/ComposeGears/Tiamat/pull/209

vkatz avatar Aug 14 '25 22:08 vkatz