NavigationComponent にて、画面遷移時に任意のデータクラスを渡したい場合、カスタムNavTypeを定義して受け渡しを可能にする必要がある。
composable<SelectFavoriteTeamRoute>(
typeMap = mapOf(
typeOf<QuestionnaireModel.Gender>() to NavType.EnumType(QuestionnaireModel.Gender::class.java),
typeOf<QuestionnaireModel.Prefecture>() to NavType.EnumType(QuestionnaireModel.Prefecture::class.java),
typeOf<QuestionnaireUIModel.Year?>() to CustomNavType.YearNavType,
typeOf<QuestionnaireUIModel.Month?>() to CustomNavType.MonthNavType,
),
) { backEntry ->
val args = backEntry.toRoute<SelectFavoriteTeamRoute>()
Timber.d("${args.gender}, ${args.prefecture}, ${args.year}, ${args.month}")
SelectFavoriteTeamScreen(
navigateToHome = navController::navigationToHome,
onBackClick = navController::navigateUp,
)
}
object CustomNavType {
val YearNavType: NavType<QuestionnaireUIModel.Year?> =
object : NavType<QuestionnaireUIModel.Year?>(isNullableAllowed = true) {
override fun get(bundle: Bundle, key: String): QuestionnaireUIModel.Year? {
return Json.decodeFromString(bundle.getString(key) ?: return null)
}
override fun parseValue(value: String): QuestionnaireUIModel.Year? = Json.decodeFromString(UriCodec.decode(value))
override fun put(bundle: Bundle, key: String, value: QuestionnaireUIModel.Year?) {
bundle.putString(key, Json.encodeToString(value))
}
override fun serializeAsValue(value: QuestionnaireUIModel.Year?): String = UriCodec.encode(Json.encodeToString(value))
}
val MonthNavType: NavType<QuestionnaireUIModel.Month?> =
object : NavType<QuestionnaireUIModel.Month?>(isNullableAllowed = true) {
override fun get(bundle: Bundle, key: String): QuestionnaireUIModel.Month? {
return Json.decodeFromString(bundle.getString(key) ?: return null)
}
override fun parseValue(value: String): QuestionnaireUIModel.Month? = Json.decodeFromString(UriCodec.decode(value))
override fun put(bundle: Bundle, key: String, value: QuestionnaireUIModel.Month?) {
bundle.putString(key, Json.encodeToString(value))
}
override fun serializeAsValue(value: QuestionnaireUIModel.Month?): String = UriCodec.encode(Json.encodeToString(value))
}
}
@Serializable
data class Year(val number: Int, val displayName: String, val isSelected: Boolean)