android
[Compose] navigation으로 object 전달하기
liz_devel
2024. 7. 30. 10:52
본글을 참고하기 전 androidx.navigation:navigation-*:2.8.0-alpha08를 사용하고 있다면 String으로 변환하지 않고 하단 이미지와같이 object를 전달해주면 된다.
(이미지 원문 - https://developer.android.com/jetpack/androidx/releases/navigation?hl=ko#2.8.0-alpha08)
나는 navigation-compose 2.7.7 버전을 사용하고 있어 navigation Route로 object 전달이 불가했기 때문에 book 객체를 json으로 변경하여 넘겨주었다.
fun navigateBookDetail(book: Book) {
val gson = Gson()
val bookJsonString = gson.toJson(book)
navController.navigateBookDetail(bookJsonString)
}
fun NavController.navigateBookDetail(book: String) {
navigate(DetailRoute.detailRoute(book))
}
Json으로 변경해주었지만 Book에는 Url이 있는데 Url을 UTF_8로 변환해주지 않으면 넘어가지 않기 때문에 변환해주어야 한다.
object DetailRoute {
const val ROUTE: String = "detail/{book}"
fun detailRoute(bookJsonString: String): String {
return "detail/${
URLEncoder.encode(
bookJsonString,
StandardCharsets.UTF_8.toString()
)
}"
}
}
변환해서 보낸 뒤 받는 곳에서 다시 Json을 Book 객체로 변환해준다.
composable(
route = DetailRoute.ROUTE,
arguments = listOf(navArgument("book") { type = NavType.StringType })
) { navBackStackEntry ->
val bookDataJson = navBackStackEntry.arguments?.getString("book")
val book = URLDecoder.decode(bookDataJson, StandardCharsets.UTF_8.toString())
val bookData = Gson().fromJson(book, Book::class.java)
BookDetailScreen(
book = bookData,
onBackClick = onBackClick
)
}
navigation 2.8.0-alpha08버전일 때 object 전달하는 방법은 간단하다.
fun navigateBookDetail(book: Book) {
navController.navigate(book)
}
composable<Book> { navBackStackEntry ->
val book = navBackStackEntry.toRoute<Book>()
BookDetailScreen(
book = book,
onBackClick = onBackClick
)
}
반응형