반응형
Stateful 이란?
내부에서 상태를 생성하는 컴포저블을 stateful이라고 한다.
Stateless 이란?
외부로 부터 상태를 받는(상태 호이스팅) 컴포저블을 stateless라고 한다.
상태를 내부에서 생성한다는 의미는 아래와 같이 name, onValueChange와 같은 상태를 직접 생성하는 컴포저블 함수를 말한다.
// Stateful 함수
@Composable
fun SomeScreen() {
val name by rememberSaveable { mutableStateOf("") }
Column(modifier = Modifier.padding(16.dp)) {
Text(
text = "Hello, $name",
modifier = Modifier.padding(bottom = 8.dp),
style = MaterialTheme.typography.h5
)
OutlinedTextField(
value = name,
onValueChange = {
//do something
},
label = { Text("Name") }
)
}
}
상태를 외부로 부터 받아 온다는 의미는 아래와 같이 SomeContent함수가 직접 상태를 가지지 않고 상태 호이스팅을 통해 name과 onNameChange과 같은 상태를 넘겨 받는 컴포저블 함수를 말한다.
@Composable
fun SomeScreen() {
var name by rememberSaveable { mutableStateOf("") }
SomeContent(name = name, onNameChange = { name = it })
}
// Stateless 함수
@Composable
fun SomeContent(name: String, onNameChange: (String) -> Unit) {
Column(modifier = Modifier.padding(16.dp)) {
Text(
text = "Hello, $name",
modifier = Modifier.padding(bottom = 8.dp),
style = MaterialTheme.typography.h5
)
OutlinedTextField(
value = name,
onValueChange = onNameChange,
label = { Text("Name") }
)
}
}
상태 호이스팅을 통해 Stateful한 함수를 Stateless한 함수로 바꾸주면 아래와 같은 장점을 얻을 수 있다.
- 단일 소스 저장소: 상태를 복제하는 대신 옮겼기 때문에 소스 저장소가 하나만 있습니다. 버그 방지에 도움이 됩니다.
- 캡슐화됨: 스테이트풀(Stateful) 컴포저블만 상태를 수정할 수 있습니다. 철저히 내부적 속성입니다.
- 공유 가능함: 호이스팅한 상태를 여러 컴포저블과 공유할 수 있습니다. 다른 컴포저블에서 name을 사용하려는 경우 호이스팅을 통해 그렇게 할 수 있습니다.
- 가로채기 가능함: 스테이트리스(Stateless) 컴포저블의 호출자는 상태를 변경하기 전에 이벤트를 무시할지 수정할지 결정할 수 있습니다.
- 분리됨: 스테이트리스(Stateless) ExpandingCard의 상태는 어디에나 저장할 수 있습니다. 예를 들어 이제는 name을 ViewModel로 옮길 수 있습니다.
출처
https://developer.android.com/jetpack/compose/state?hl=ko
반응형
'안드로이드' 카테고리의 다른 글
Dagger의 @Binds vs @Provides, @Qualifier vs @Named, @Lazy<T> vs @Provider<T> (0) | 2022.08.29 |
---|---|
컴포즈 부수효과 (0) | 2022.07.30 |
Sealed Class를 이용한 Retrofit 결과 처리 (0) | 2022.06.22 |
안드로이드 테스팅 (0) | 2022.05.28 |
광고 정책 위반으로 앱 삭제 대응 (0) | 2021.06.23 |