Grusie 안드로이드 개발 기술 블로그

[Android] JetPack:Compose 네비게이션(navigation) - 2 본문

안드로이드 개발/라이브러리

[Android] JetPack:Compose 네비게이션(navigation) - 2

grusie 2024. 3. 7. 10:43
728x90
반응형
SMALL

지난 번에 JetPack 네비게이션에 대해서 익히고 실제로 사용도 해보았으나, 데이터 전송에 대한 부분은 다루지 않았었다.

이번엔 네비게이션을 사용할 때 데이터를 전송하는 법에 대해서 알아보도록 하자.

 

composable(
    route = Screen.Second.name
) {
    SecondScreen(
        modifier = Modifier
            .fillMaxSize()
            .padding(8.dp),
        items = testItems,
        onItemClicked = { item -> navController.navigate("${Screen.Third.name}/$item") })
}

 우선 데이터를 전송할 SecondScreen에서 아이템이 클릭 되면, navigate()를 사용해 데이터를 전달할 수 있도록, 클릭된 아이템의 값을 url과 같은 형태로 전송한다.

 

composable(
    route = "${Screen.Third.name}/{item}",
    arguments = listOf(navArgument("item") {
        type = NavType.StringType
    })
) {
    backStackEntry ->
    val receivedItem = backStackEntry.arguments?.getString("item") ?: ""

    val context = LocalContext.current
    ThirdScreen(
        onBackBtnClicked = {
            navController.popBackStack(
                Screen.First.name,
                false
            )
        },
        item = receivedItem,
        onSharedBtnClicked = { text1, text2 ->
            shareData(context, text1, text2)
        }
    )
}

아이템을 받는 쪽에서는 route에 전달 받을 키값을 사용하여 작성해두고, arguments 파라미터에, 키값과 type을 List형태로 추가한다.

backStackEntry를 통해 이전 페이지에서 전달 받은 arguments 들 중에서, "item"이라는 키값을 가진 String값을 가져와, ThirdScreen에 파라미터로 넘겨 사용하게 된다.

@Composable
fun ThirdScreen(
    onBackBtnClicked: () -> Unit,
    item: String,
    onSharedBtnClicked: (String, String) -> Unit
) {
    Row(
        modifier = Modifier.fillMaxSize(),
        horizontalArrangement = Arrangement.SpaceEvenly,
        verticalAlignment = Alignment.CenterVertically
    ) {
        Button(onClick = { onBackBtnClicked() }) {
            Text(text = "backButton")
        }
        Button(onClick = { onSharedBtnClicked("text1", item) }) {
            Text(text = "sharedButton")
        }
    }
}

ThirdScreen에서는 전달 받은 아이템을 가지고, SharedBtnClicked를 호출해, 전달이 잘 되었는지 확인한다.

네비게이션 데이터 전송

무사히 11이 뜨는 것을 확인할 수 있다.

후기

데이터를 전달하는 법 중 가장 간단한 방법에 대해 알아보았다, 다른 방법으로는 enum class가 아닌 sealed class나 인터페이스를 사용하여 데이터를 전달하는 방법으로, 전달하는 객체의 타입에 상관없이 전달 할 수 있도록 하는 방법이 있다.

소스코드

https://github.com/Grusie/blog-source/tree/master/TestNavigation

 

반응형
LIST