Compose의 NavController와 Parcelize를 이용해 라우팅 시 스크린간에 데이터 전달을 구현해볼 예정이다.
우선 코틀린에서 데이터를 직렬화하는 방법인 parcelize를 build.gradle(:app)에 추가한다.
// build.gradle(:app)
plugins {
...
id("kotlin-parcelize")
}
...
Parcelize를 사용하는 이유는 NavBackStackEntry의 SavedStateHandle을 사용하므로 모든 결과는 Bundle에 배치할수 있어야하기때문이다. Bundle클래스를 확인해보면 Parcelable인터페이스의 구현체이다.
Parcelable 또는 Serializable이 아닌 맞춤 타입의 결과를 저장하려면 이전 NavBackStackEntry의 ViewModelStore를 사용하여 ViewModel을 만들면 된다고 한다.
// 넘기는 화면
val result = Result(
id = 99,
name: "호나우두"
)
...
// 사용법
navController.currentBackStackEntry?.savedStateHandle?.set("key", result) // 현재 스택엔트리에 추가
navController.previousBackStackEntry?.savedStateHandle?.set("key", result) // 이전 스택엔트리에 추가
navController.naviagte("라우트이름/$id") {
...NavOptionBuilder
}
...
@Parcelize
data class Result(
val id: Int,
val name: String,
) : Parcelable
set을 할때 데이터는 Parcelable 또는 Serializable이 아닌 맞춤 타입이어야 한다.
// 데이터 넘겨받은화면
...
val resultData = navController.previousBackStackEntry?.savedStateHandle?.get<Result>("key")
Log.d("로그", resultData) // id = 99, name = "호나우두"
Reference
https://developer.android.com/guide/navigation/use-graph/programmatic?hl=ko#kotlin
탐색 구성요소와 프로그래매틱 방식으로 상호작용 | Android 개발자 | Android Developers
프로그래밍 방식으로 생성되어 특정 탐색 요소와 상호작용합니다.
developer.android.com
https://developer.android.com/reference/android/os/Bundle
Bundle | Android Developers
android.inputmethodservice
developer.android.com
https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ko
ViewModel 개요 | Android 개발자 | Android Developers
ViewModel을 사용하면 수명 주기를 인식하는 방식으로 UI 데이터를 관리할 수 있습니다.
developer.android.com
'Android' 카테고리의 다른 글
| [Android] Compose를 이용해 Swipe 기능 만들기 (0) | 2024.02.09 |
|---|---|
| [Android][Compose] 부모요소의 높이를 최대높이로 지정하기, 동적 높이 계산하기 (1) | 2024.02.09 |
| Jetpack Compose - ViewModel (0) | 2023.12.14 |
| 안드로이드 Jetpack Compose 기본 Composable 모아보기 Row / Column / Box / LazyColumn / Image / Card / Scaffold / TextField / Button / Navigation (0) | 2023.12.14 |
| Android RecyclerView / 안드로이드 리사이클러뷰 사용법 (0) | 2023.12.04 |