루틴 생성 기능 만들면서 제일 고민됐던 게 화면 이동할 때 상태를 어떻게 유지하느냐였다.
예를 들면, 제스처 고르고, 기기 상태 설정하고, 아이콘 고르고... 이게 다 다른 화면에서 이뤄지는데,
이걸 다 ViewModel이 기억하고 있어야 한다는 얘기.
그래서 사용한 게 바로 SavedStateHandle.
LUMOS 루틴 생성은 흐름이 이렇게 되어 있다:
제스처 선택 / 루틴 제목 입력 / 이모지 선택 → 기기 설정 → 상태 직렬화 → 저장
이 모든 과정에서 여러 화면을 거치게 되는데,
이때 필요한 상태값을 SavedStateHandle로 전달하거나, 받아왔다.
| 상태 | 용도 |
|---|---|
| gestureId | 어떤 제스처 썼는지 기억해둬야 루틴 저장 가능 |
| commandDeviceJson | 기기 설정한 값, JSON으로 넘겨야 함 |
| routineId | 수정 모드일 때 어떤 루틴인지 알아야 함 |
| iconId | 유저가 선택한 아이콘 정보 |
예를 들면,
기기 설정 프리뷰 다 하고 돌아왔을 때, commandDeviceJson을 이전 화면의 SavedStateHandle에 저장해두면,
루틴 생성 ViewModel이 그걸 꺼내서 바로 상태 반영 가능함.
// ViewModel에서
class RoutineCreateViewModel @Inject constructor(
savedStateHandle: SavedStateHandle
) : ViewModel() {
val gestureId: String? = savedStateHandle["gestureId"]
val commandDeviceJson: String? = savedStateHandle["commandDeviceJson"]
}
// 돌아가기 전, 상태를 이전 화면에 넘길 때
navController.previousBackStackEntry
?.savedStateHandle
?.set("commandDeviceJson", device.toJson())
| 항목 | 설명 |
|---|---|
| 목적 | 화면 간 상태 전달 + 복원 |
| 장점 | 생명주기에 덜 휘둘림, ViewModel 안에서 관리 |
| 적용 | 루틴 생성 흐름 (제스처, 기기 상태, 아이콘 등) |
| 방식 | 화면 진입 시 가져오거나, 이전 화면에 상태 세팅 |