stateless : 내부에 state, remember 같은 자체적을 정보를 저장할 수있는 변수를 저장할 수 있는 변수를 갖지 않는 함수@Composablefun StatelessFun( text: String, myVar2: Int, onClickHoisting : (myVar) -> Unit ) { ... TextField( value : text, onValueChange= onClickHoisting ) // OR onClick = { onClickHoisting.invoke() }
statefull : 자체적으로 상태를 저장할 수 있는 변수를 갖는 함수@Composablefun StatefullFun ( text: String onClickHandling : (String) -> Unit ) { var stateVariable by remember { mutableStateOf{""}
TextField( value : text, onValueChange= { text = it } )
remember를 사용하여 객체를 저장하는 컴포저블에는 내부 상태가 포함되어 있어 컴포저블을 스테이트풀(Stateful)로 만듭니다. 이는 호출자가 상태를 제어할 필요가 없고 상태를 직접 관리하지 않아도 상태를 사용할 수 있는 경우에 유용합니다. 그러나 내부 상태를 갖는 컴포저블은 재사용 가능성이 적고 테스트하기가 더 어려운 경향이 있습니다.
상태를 보유하지 않는 컴포저블을 스테이트리스(Stateless) 컴포저블이라고 합니다. 상태 호이스팅을 사용하면 스테이트리스(Stateless) 컴포저블을 쉽게 만들 수 있습니다.
Compose에서 상태 호이스팅은 컴포저블을 스테이트리스(Stateless)로 만들기 위해 상태를 컴포저블의 호출자로 옮기는 패턴입니다. Jetpack Compose에서 상태 호이스팅을 위한 일반적 패턴은 상태 변수를 다음 두 개의 매개변수로 바꾸는 것입니다.
- value: T - 표시할 현재 값입니다.
- onValueChange: (T) -> Unit - 값을 변경하도록 요청하는 이벤트입니다. 여기서 T는 제안된 새 값입니다.
여기서 이 값은 수정할 수 있는 모든 상태를 나타냅니다.
상태가 내려가고 이벤트가 올라가는 패턴을 단방향 데이터 흐름(UDF)이라고 하며, 상태 호이스팅은 이 아키텍처를 Compose에서 구현하는 방법입니다. 자세한 내용은 Compose 아키텍처 문서를 참고하세요.
이러한 방식으로 끌어올린 상태에는 중요한 속성이 몇 가지 있습니다.
- 단일 소스 저장소: 상태를 복제하는 대신 옮겼기 때문에 소스 저장소가 하나만 있습니다. 버그 방지에 도움이 됩니다.
- 공유 가능함: 끌어올린 상태를 여러 컴포저블과 공유할 수 있습니다.
- 가로채기 가능함: 스테이트리스(Stateless) 컴포저블의 호출자는 상태를 변경하기 전에 이벤트를 무시할지 수정할지 결정할 수 있습니다.
- 분리됨: 구성 가능한 스테이트리스(Stateless) 함수의 상태는 어디에든(예: ViewModel) 저장할 수 있습니다.
위의 모든 이점을 활용하려면 WaterCounter에 이를 구현해 보세요.
스테이트풀(Stateful)과 스테이트리스(Stateless) 비교
구성 가능한 함수에서 모든 상태를 추출할 수 있는 경우 결과로 생성되는 구성 가능한 함수를 스테이트리스(Stateless)라고 합니다.
스테이트리스(Stateless) 컴포저블은 상태를 소유하지 않는 컴포저블입니다. 즉, 새 상태를 보유하거나 정의하거나 수정하지 않습니다.
스테이트풀(Stateful) 컴포저블은 시간이 지남에 따라 변할 수 있는 상태를 소유하는 컴포저블입니다.
실제 앱에서는 컴포저블의 기능에 따라 컴포저블을 100% 스테이트리스(Stateless)로 하는 것은 어려울 수 있습니다. 컴포저블이 가능한 한 적게 상태를 소유하고 적절한 경우 컴포저블의 API에 상태를 노출하여 상태를 끌어올릴 수 있도록 컴포저블을 디자인해야 합니다.
'Android-jetpack Compose' 카테고리의 다른 글
Android - Dependency Injection(Hilt)/Room 기본 개념 설정 (0) | 2023.04.01 |
---|---|
jackpack compose - Navigation : 정의, 개발 절차 샘플 (0) | 2023.03.30 |
jetpack compose 시작하기, 관련 링크, 교육 자료 등 (0) | 2023.03.18 |
jackpack compose - Android Studio 설정 (0) | 2023.03.18 |
jackpack compose - Api 가이드라인 (0) | 2023.03.18 |