Hi! Is there a way to make/use a generic CustomNav...
# navigation-architecture-component
d
Hi! Is there a way to make/use a generic CustomNavType that just serializes the content to Json using Kotlinx serialization and puts it in the bundle (I'm using the new type-safe navigation in 2.8.0...)?
I tried this, but I know something's wrong since the app keeps crashing that it doesn't find the route...:
Copy code
@OptIn(InternalSerializationApi::class)
inline fun <reified T : Any> createNavType(
    noinline serializeAsString: (T) -> String = { it.toString() }
) =
    typeOf<T>() to JsonNavType(T::class.serializer(), serializeAsString)

@OptIn(InternalSerializationApi::class)
inline fun <reified T : Any> createNavTypeForSealed(
    inheritingTypes: List<KType>
): List<Pair<KType, JsonNavType<T>>> {
    val navType = JsonNavType(T::class.serializer())
    return inheritingTypes.map { it to navType }
}

@OptIn(InternalSerializationApi::class)
inline fun <reified T : Any> createListNavType() =
    typeOf<List<T>>() to JsonNavType(ListSerializer(T::class.serializer()))

class JsonNavType<T>(
    private val serializer: KSerializer<T>,
    private val serializeAsString: (T) -> String = { it.toString() }
) : NavType<T>(isNullableAllowed = false) {

    override fun get(bundle: Bundle, key: String): T? {
        return bundle.getString(key)?.let { Json.decodeFromString(serializer, it) }
    }

    override fun parseValue(value: String): T {
        return Json.decodeFromString(serializer, value)
    }

    override fun put(bundle: Bundle, key: String, value: T) {
        bundle.putString(key, Json.encodeToString(serializer, value))
    }

    override fun serializeAsValue(value: T): String {
        return serializeAsString(value)
    }

    override fun valueEquals(value: T, other: T): Boolean {
        return serializeAsString(value) == serializeAsString(other)
    }
}