Parcelables 当前不支持默认值,因此您需要将对象作为字符串值传递。是的,这是一种解决方法。因此,我们可以将该对象转换为 JSON(字符串)并通过导航传递,然后将该 JSON 解析回目的地的对象,而不是将对象本身作为 Parcelize 对象传递。您可以使用GSON进行对象到 json 字符串的转换...
Json 到对象
fun <A> String.fromJson(type: Class<A>): A {
return Gson().fromJson(this, type)
}
对象到 Json 字符串
fun <A> A.toJson(): String? {
return Gson().toJson(this)
}
用户 NavType.StringType 而不是 NavType.ParcelableType..
composable("detail/{item}",
arguments = listOf(navArgument("item") {
type = NavType.StringType
})
) {
it.arguments?.getString("item")?.let { jsonString ->
val user = jsonString.fromJson(User::class.java)
DetailScreen( navController = navController, user = user )
}
}
现在通过传递字符串导航..
val userString = user.toJson()
navController.navigate(detail/$userString")
编辑:您可以导航的 Json-String 也有限制。如果 Json-String 的长度太长,那么 NavController 将无法识别您的 Composable Route 最终会引发异常......另一种解决方法是使用全局变量并在导航之前设置其值......然后传递这个值作为可组合函数中的参数..
var globalUser : User? = null // global object somewhere in your code
.....
.....
// While Navigating
click { user->
globalUser = user
navController.navigate(detail/$userString")
}
// Composable
composable( "detail") {
DetailScreen(
navController = navController,
globalUser)
}
注意:-> ViewModels 也可以用来实现这一点..