Compose는 리컴포지션 중에 상태를 기억하지만, 구성 변경 중에는 이 상태를 유지하지 않는다.
그렇기에 상태를 유지하기 위해서는 remeberSaveable을 사용해야 한다.
https://small-stepping.tistory.com/880
이전에 공부했던 상태를 저장하는 remember와 mutableStateOf()는 상태는 저장하지만, 화면을 회전하거나 하는 등의 구성 변경이 일어난다면 값을 저장하지 못하는 휘발성을 보여주었다. 그래서 앱을 회전 못시키게 하거나 리컴포지션 하지 못하게 제약을 둬야하는데 이를 피하고 리컴포지션 후에도 값 손실을 방지하는 것이 이 rememberSaveable이다.
Android OS에서 활동을 소멸하고 다시 만드는 경우 rememberSaveable 함수를 사용하여 필요한 값을 저장한다. 리컴포지션 중에 값을 저장하려면 remember를 사용해야 한다. rememberSaveable을 사용하여 리컴포지션 및 구성 변경 중에 값을 저장한다.
구성 변경
- 구성 변경은 기기 상태가 매우 급격하게 변경되어 시스템이 변경사항을 확인하는 가장 쉬운 방법이 활동을 소멸시키고 다시 빌드하는 것일 때 발생한다.
- 구성 변경은 사용자가 기기를 세로 모드에서 가로 모드로 또는 가로 모드에서 세로 모드로 회전할 때 가장 흔하게 발생합니다. 기기 언어가 변경되거나 사용자가 하드웨어 키보드를 연결할 때도 구성이 변경될 수 있다.
- 구성 변경이 발생하면 Android는 모든 활동 수명 주기의 종료 콜백을 호출한다. 그러면 Android는 활동을 처음부터 다시 시작하여 모든 수명 주기 시작 콜백을 실행한다.
- Android는 구성 변경으로 인해 앱을 종료할 때 onCreate()를 사용하여 활동을 다시 시작한다.
- 구성 변경 이후에도 효력을 유지해야 하는 값을 저장하려면 rememberSaveable을 사용해 변수를 선언한다.
위 팁계산기의 경우 기존에 remember를 사용해 상태를 저장했기 때문에 구성변화가 일어나면 입력했던 값과 도출된 값이 전부 초기화 되는 상황이 벌어졌다.
var amountInput by rememberSaveable { mutableStateOf("") }
var tipInput by rememberSaveable { mutableStateOf("") }
var roundUp by rememberSaveable { mutableStateOf(false) }
그러나 이와 같이 remember에서 rememberSaveable로만 바꾸어도 구성변화시 상태가 초기화되는 일은 벌어지지 않는다. 그렇다고 복잡한 상태 개체를 rememberSaveable로 저장하면 UI를 복구할 때 걸리는 시간이 늘어나 사용자의 경험을 망칠 수 있다. 이러한 경우에는 보다 세부적인 상태 관리 기술을 사용하거나 고급 시나리오를 위해 Android ViewModel을 활용하는 것이 좋다.
참고: Android가 앱 전체 프로세스를 종료하는 경우도 있는데 이 프로세스에는 앱과 관련된 모든 활동이 포함됩니다. Android는 시스템이 스트레스를 받고 시각적 지연의 위험이 있을 때 이와 같이 종료하므로 콜백이나 코드가 이 시점에서 추가로 실행되지 않습니다. 앱 프로세스는 백그라운드에서 자동으로 간단히 종료됩니다. 그러나 사용자에게는 앱이 닫힌 것처럼 보이지 않습니다. 사용자가 Android 시스템이 종료한 앱으로 다시 이동하면 Android는 앱을 다시 시작합니다. 이 경우 사용자가 데이터 손실을 경험하지 않도록 해야 합니다.
위에서 강조한대로 사용자가 데이터 손실을 경험하지 않도록 따로 방법을 강구하는 것이 필요하다.
구성변경의 경우, rememberSaveable을 사용하여 값을 저장하면 필요한 경우 활동이 복원될 때 사용할 수 있다.
앱을 껐다키는 등 이후에도 데이터가 저장되야하는 경우, Room DB나 웹 통신을 통해 클라우드 서버에서 받아오거나 API에 연결되어 서버에서 정보를 받아오는 등의 방법을 강구하는게 좋다.
더 자세한 내용은 이곳을 참고하면 좋다.
https://developer.android.com/develop/ui/compose/state?hl=ko#restore-ui-state
'개발 > AOS' 카테고리의 다른 글
애플리케이션 테스트 01. 자동테스트란? (0) | 2024.05.09 |
---|---|
앱 아키텍처 알아보기 (0) | 2024.05.08 |
AnimatedVisibility()와 MutableTransitionState() (0) | 2024.05.07 |
Scaffold와 LazyColumn (1) | 2024.05.03 |
Jetpack Compose 커스텀 그림자 (0) | 2024.05.02 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!