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
        )

    }
반응형