Android 不支持操作异常:序列化文件不';不支持默认值-Jetpack组合导航

Android 不支持操作异常:序列化文件不';不支持默认值-Jetpack组合导航,android,kotlin,android-jetpack,android-jetpack-compose,Android,Kotlin,Android Jetpack,Android Jetpack Compose,我正在使用Jetpack Compose Navigation将一个运行状况实例传递给另一个composable。下面的代码显示了我的健康等级和目的地 Health.kt: 数据类运行状况( val高度:Int, val重量:整数, 年龄:Int, 性别:性别 ):可序列化 枚举类性别:可序列化{男,女} NavDestination.kt 可组合( route=“result/{health}”, 参数=列表( navArgument(“健康”){ 类型= SerializableType(

我正在使用Jetpack Compose Navigation将一个运行状况实例传递给另一个composable。下面的代码显示了我的健康等级和目的地

Health.kt:

数据类运行状况(
val高度:Int,
val重量:整数,
年龄:Int,
性别:性别
):可序列化
枚举类性别:可序列化{男,女}
NavDestination.kt

可组合(
route=“result/{health}”,
参数=列表(
navArgument(“健康”){
类型=
SerializableType(Health::class.java)
}
)
){BackbackEntry->
val health=(backStackEntry.arguments?.getSerializable(“health”)作为?health)?:return@composable
结果屏幕(导航操作=导航操作,运行状况=运行状况)
}
NavActions.kt

val navigateToResultScreen={health:health->
导航(“结果/{$health}”)
}
然而,根据日志,我得到了这个错误。如有任何协助,将不胜感激

E/AndroidRuntime:致命异常:主
进程:com.octagon_technologies.bmicaculator,PID:20788
java.lang.UnsupportedOperationException:序列化文件不支持默认值。
位于androidx.navigation.NavType$SerializableType.parseValue(NavType.java:838)
位于androidx.navigation.NavType$SerializableType.parseValue(NavType.java:791)
位于androidx.navigation.NavType.parseAndPut(NavType.java:96)
位于androidx.navigation.NavDeepLink.parseArgument(NavDeepLink.java:299)
位于androidx.navigation.NavDeepLink.getMatchingArguments(NavDeepLink.java:260)
位于androidx.navigation.NavDestination.matchDeepLink(NavDestination.java:474)
在androidx.navigation.NavGraph.matchDeepLink(NavGraph.java:79)中
在androidx.navigation.NavController.navigate(NavController.java:1034)
在androidx.navigation.NavController.navigate(NavController.java:1017)
在androidx.navigation.compose.NavHostControllerKt.navigate(NavHostController.kt:107)
在androidx.navigation.compose.NavHostControllerKt.navigate$default中(NavHostController.kt:106)
在com.octagon_technologies.bmicaller.ui.navigation.NavActions$navigateToResultScreen$1.invoke(NavActions.kt:9)上
在com.octagon_technologies.bmicaller.ui.navigation.NavActions$navigateToResultScreen$1.invoke(NavActions.kt:8)上
在com.octagon_technologies.bmicaller.ui.screens.home.HomeScreenKt$HomeScreen$1$6.invoke(HomeScreen.kt:122)
在com.octagon_technologies.bmicaller.ui.screens.home.HomeScreenKt$HomeScreen$1$6.invoke(HomeScreen.kt:120)
在com.octagon_technologies.bmiculator.ui.components.home.CalculateBtnKt$CalculateButton$1$1.invoke(CalculateBtn.kt:29)上
在com.octagon_technologies.bmiculator.ui.components.home.CalculateBtnKt$CalculateButton$1$1.invoke(CalculateBtn.kt:29)上
这无法工作的原因:

Serializable
Parcelable
没有一致的API表面,不允许将字符串自动解析到自定义类实例中。这就是为什么
parseValue
抛出一个
不支持的操作异常

预计您只会在这个深度链接中传递ID,而不会传递完整的对象

解决方法:

composable(
    route = "result",
    arguments = listOf(
        navArgument("health") {
            type =
                NavType.SerializableType(Health::class.java)
        }
    )
) {
    val health = (navController.previousBackStackEntry.arguments?.getSerializable("health") as? Health) ?: return@composable
    ResultScreen(navActions = navActions, health = health)
}
像这样导航:

navController.currentBackStackEntry
    ?.arguments?.putSerializable("health", health)
navController.navigate("result")