Compose에서 네비게이션을 통한 데이터 전달 및 savedStateHandle 활용
2025. 2. 26. 17:31ㆍAndroid/Jetpack
728x90
반응형
프로젝트 구축하는 과정에서 문제가 하나 발생했다.
✅ 문제 상황
- AScreen에서 BScreen으로 화면 이동 후 BScreen에서 선택한 값을 AScreen으로 돌려주기
- 이 때, ViewModel을 통해 돌려주면 viewModel이 초기화 되는 이슈 발생
✅ 해결 방법
- NavController의 savedStateHandle을 이용하여 화면 간 데이터 전달
ViewModel을 통해 데이터를 전달할 때, 전달된 데이터가 초기화 되는 현상이 발생했다.
당연하다. ViewModel을 새로 만드는 멍청한 짓을 했으니까 ㅋ
그래서 찾아낸 다른 방법! NavController 이용하기~
화면을 이동할 때 사용하는 Navigation Component는 데이터를 전달하는 savedStateHandle을 지원한다.
이걸 활용하면 데이터를 쉽게 전달하고, 화면을 이동하거나 돌아왔을 때도 데이터를 유지할 수 있다.
1. savedStateHandle이란?
- Jetpack Navigation에서 화면 간 데이터를 주고받을 때 사용하는 ViewModel 내 key-value 저장소
- 기본적으로 Bundle처럼 동작하지만, 화면이 회전되거나 프로세스가 종료되더라도 데이터는 유지됨
2. Navigation을 통한 데이터 전달하기
2-1) 데이터 전달하기 (BScreen → AScreen)
- 선택한 데이터(data)를 savedStateHandle을 통해 저장 후 popBackStack()으로 화면 전환
navController.previousBackStackEntry
?.savedStateHandle
?.set("data", data) // 데이터 전달 (key-value)
?.set("code", code) // 데이터 전달 (key-value)
navController.popBackStack()
2-2) AScreen에서 데이터 가져오기
- savedStateHandle.get<String>(”data”)로 데이터를 가져와서 유지
val backStackEntry = navController.currentBackStackEntryAsState()
val selectedCountry = backStackEntry.value
?.savedStateHandle
?.get<String>("data") // 저장된 값 가져오기
이렇게 이용하면 Compose에서 화면간 데이터를 쉽게 전달하고 받아와 사용할 수 있다.
728x90
반응형
'Android > Jetpack' 카테고리의 다른 글
[Jetpack WebView] shouldOverrideUrlLoading vs shouldInterceptRequest 완벽 정리 (0) | 2025.03.20 |
---|---|
Jetpack Compose에서 remember vs rememberSaveable 차이 완벽 정리 (0) | 2025.02.13 |
Android Studio에서 Proto DataStore 설정하는 방법 (gradle kotlin) (0) | 2024.11.07 |
Preference DataStore와 Proto DataStore의 차이 (0) | 2024.11.05 |
[Android/Jetpack]ViewModel + Databinding + LiveData (0) | 2023.02.24 |