본문에 들어가기 전 체크!
✅ Composition 관련 용어
- 컴포지션 : Jetpack Compose가 Composable 함수를 실행할 때 빌드한 UI
- 초기 컴포지션 : 처음 Composable을 실행하여 Composition을 생성
- 리컴포지션 : 상태 변경 시 Composition을 업데이트 하기 위해 Composable을 다시 실행하는 과정
✅ remember 및 state가 필요한 이유
이전의 코틀린처럼 우리가 액티비티 및 뷰에 대한 정보를 가지고있는게 아니라, 컴포즈에서는 os에 뷰를 이렇게 그려달라고 함수만 전달하는 것이기때문에 data가 저장이 되지않음.
💡Compose State 추적
일반적인 변수의 경우 값이 재할당되어도 Compose에서 해당 변수의 값 변경을 “상태 변경”으로 감지하지 못하므로 리컴포지션이 발생하지 않음
Compose에서는 이를 위해 State와 MutableState를 사용하여 각 Composable을 추적하고 해당 value가 변경되면 리컴포지션을 트리거함
- mutableStateOf 함수를 사용하여 관찰 가능한 MutableState를 만들 수 있음.
- 해당 함수는 initial 값을 매개변수로 받아 State 객체에 래핑하여 상태의 value 값을 관찰 가능한 상태로 만듦
- mutableStateOf 함수는 MutableState 타입을 반환하므로 value를 업데이트하면 상태가 업데이트되며 Compose는 value를 읽는 Composable 함수에 리컴포지션을 트리거함
- 하지만 이렇게만 하면 함수가 재구성 되면서 변수가 다시 초기화 되었기 때문에 변수의 업데이트 값을 유지할 수 없음
- remember를 사용하여 위의 문제를 해결할 수 있음
💡Remember
remember로 계산된 값은 Initial Composition 중에 Composition에 저장되고 저장된 값은 Recomposition 발생 시 유지됨
val count: MutableState<Int> = remember { mutableStateOf(0) }
Text("You've had ${count.value} glasses.")
Button(onClick = { count.value++ }, Modifier.padding(top = 8.dp)) {
Text("Add one")
}
- 위와 같은 형식으로 remember로 mutableStateOf를 감싸서 사용
- 다만 위와 같은 방법을 사용하면 count.value 형식으로 value를 찾을 때마다 직접 getter를 호출해야 함
// by 키워드를 사용하기 위해선 아래 두 가지를 import 해야함
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
var count by remember { mutableStateOf(0) }
Text("You've had $count glasses.")
Button(onClick = { count++ }, Modifier.padding(top = 8.dp)) {
Text("Add one")
}
- by 키워드를 사용하여 속성을 위임한 뒤 버튼 클릭 시 데이터가 변경되므로 var 키워드로 변수를 정의
- by를 사용하며 그 자체로 수정이 가능해져 var로 정의한 것
💡rememberSaveable
Config Change로 인한 구성 변경이 발생한 경우에는 remember로도 데이터를 유지할 수 없음. 이를 위해 rememberSaveable라는 API를 사용
- Bundle에 저장할 수 있는 모든 값을 자동으로 저장
- 앱의 UX 상황에 맞춰 remember를 사용할 지 rememberSaveable를 사용할 지 결정해야 함
💡Bundle에 저장할 수 없는 항목의 경우
커스텀 Saver 객체를 전달해야 함
- Parcelize 주석 추가
- @Parcelize 주석을 추가하면 객체가 parceable이 되며 번들로 제공됨
- MapSaver API 사용
- key-value 집합으로 객체를 변환하는 규칙을 정의하여 Bundle에 저장할 수 있는 값 집합으로 만들 수 있음
- ListSaver API 사용
- list 형태로 stateSaver를 만들어 사용
🔥참고 자료
Android | Jetpack Compose Remember State
읽기 전 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다. 개인적으로 실습하면서 배운 점을 정리한 글입니다, Jetpack Compose의 State 코드랩과 Jetpack Compose State 공식문서의 내
8iggy.tistory.com
'Android > Compose' 카테고리의 다른 글
NavController를 이용한 데이터 전달 (0) | 2023.10.26 |
---|---|
이미지를 포함한 Composable 화면 비트맵으로 저장 후 공유하기 (1) | 2023.10.24 |
State Hoisting & ViewModel (0) | 2023.10.24 |