Nikhil Parab
01/28/2025, 6:31 AMinline fun <reified T : Any> serializableType(
isNullableAllowed: Boolean = false,
json: Json = Json,
) = object : NavType<T>(isNullableAllowed = isNullableAllowed) {
override fun get(bundle: Bundle, key: String) =
bundle.getString(key)?.let<String, T>(json::decodeFromString)
override fun parseValue(value: String): T = json.decodeFromString(value)
override fun serializeAsValue(value: T): String = json.encodeToString(value)
override fun put(bundle: Bundle, key: String, value: T) {
bundle.putString(key, json.encodeToString(value))
}
}
but still I am getting this error,
java.lang.IllegalArgumentException: Route companyname.data.model.Route.PartValidation could not find any NavType for argument validation of type companyname.domain.model.ValidationItem? - typeMap received was {companyname.domain.model.ValidationItem (Kotlin reflection is not available)=nav_type}
Stylianos Gakis
01/28/2025, 9:01 AMT : Any
and none of the function signatures seem to allow for T
to be null.
In contrast, I am copy-pasting our implementation of this here:
@Suppress("NOTHING_TO_INLINE")
internal data class JsonSerializableNullableNavType<T : Any?>(
private val serializer: KSerializer<T?>,
) : NavType<T?>(isNullableAllowed = true) {
override fun put(bundle: Bundle, key: String, value: T?) {
bundle.putString(key, value?.encodedAsString())
}
override fun get(bundle: Bundle, key: String): T? {
val data = bundle.getString(key) ?: return null
return parseValue(data)
}
override fun serializeAsValue(value: T?): String {
if (value == null) return "null"
return Uri.encode(value.encodedAsString())
}
override fun parseValue(value: String): T? {
if (value == "null") return null
return value.decodedFromString()
}
private inline fun T.encodedAsString(): String = Json.encodeToString(serializer, this)
private inline fun String.decodedFromString(): T? = Json.decodeFromString(serializer, this)
}
Where the nullability is marked explicitly in the function signatures.Stylianos Gakis
01/28/2025, 9:03 AMserializeAsValue
as specified in the docs https://developer.android.com/guide/navigation/design/kotlin-dsl#custom-types