hoisting이란 외부로 선언을 끌어올리는 것
State Hoisting
컴포즈에서 상태 호이스팅은 컴포저블을 Stateless
로 만들기 위해 State
를 호출자로 옮기는 패턴입니다. 자바스크립트의 호이스팅과는 사뭇 다른 개념입니다. 자바스크립트에선 현상이지만 컴포즈에선 패턴입니다.
컴포즈에서 상태 호이스팅을 하는 일반적인 패턴은 컴포저블 내부에서 선언한 State
를 다음 두 개의 매개변수로 바꾸는 것입니다.
- value: T = 표시할 현재 값
- onValueChange: (T) -> Unit = T가 제안된 새 값일 경우 값을 변경하도록 요청하는 이벤트
꼭 onValueChange
로 제한되진 않습니다. 컴포저블에서 더 구체적인 이벤트가 필요하다면 람다를 사용하여 이벤트를 정의하면 됩니다.
장점
- 단일 정보 소스 :
State
를 복제하는 대신 매개변수로 옮겼기 때문에 소스가 하나만 있습니다. 따라서 버그 방지에 도움이 됩니다. - 캡슐화됨 :
Stateful
컴포저블(넘기는 놈)만 상태를 수정할 수 있습니다. 철저히 내부적 속성입니다. - 공유 가능 : 호이스팅을 하게 되면 한
State
를 여러 컴포저블과 공유할 수 있습니다. 다른 컴포저블에서 name를 읽으려는 경우 호이스팅을 했기 때문에 넘기기만 하면 됩니다. - 가로채기 가능 :
Stateless
컴포저블의 호출자는 상태를 변경하기 전, 이벤트를 무시할지 수정할지 결정할 수 있습니다. - 분리됨 :
Stateless
컴포저블의 상태는 어디에나 저장할 수 있습니다.viewModel
로도 이동시킬 수 있습니다.
예제
@Composable
fun GreetingScreen(){
var name by rememberSaveable { mutableStateOf("") }
Greeting(name = name) {
name = it
}
}
@Composable
fun Greeting(name: String, onValueChanged: (String) -> Unit) {
Column(modifier = Modifier.padding(16.dp)) {
if(name.isNotEmpty())
Text(
text = "Hello! $name",
modifier = Modifier.padding(bottom = 8.dp),
style = MaterialTheme.typography.bodyMedium
)
OutlinedTextField(
value = name,
onValueChange = onValueChanged,
label = { Text("Name")}
)
}
}
내부에서 사용하던 name
을 GreetingScreen
에서 넘겨주는 방식으로 변경하였습니다Greeting
에서 상태를 끌어올리면 재활용 및 테스트하기 편리합니다. 또한 Greeting
는 State
와 저장 방식이 분리 됐다고 할 수 있습니다. Greeting
에서 State
를 쓰고 있지만 GreetingScreen
에 State
가 저장돼 있다는 의미입니다. 따라서 GreetingScreen
의 State
를 수정하거나 교체해도 Greeting
을 수정할 필요가 없습니다
데이터 흐름
State
가 내려가고 이벤트가 올라가는 패턴을 단방향 데이터 흐름이라고 합니다. 제가 작성한 예시를 예로 들면 GreetingScreen
에서 Greeting
으로 State
가 내려가고 Greeting
에서 GreetingScreen
으로 이벤트를 올립니다.
참고
상태 및 Jetpack Compose | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 상태 및 Jetpack Compose 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 앱의 상태는 시간이 지남에 따라
developer.android.com
'안드로이드(Compose) > 개념' 카테고리의 다른 글
remember 강제 재실행하는 방법 (0) | 2024.04.11 |
---|---|
Compose에서 State를 복원하는 방법 (0) | 2024.04.04 |
Stateful 과 Stateless (0) | 2024.03.25 |
지원되는 기타 State 유형 (0) | 2024.03.20 |
State and Jetpack Compose (0) | 2024.03.18 |