상태를 갖거나 갖지 않는 Composable 함수 이해
UI는 항상 현재 데이터를 보여줘야만 한다는 것이 중요하다. 따라서 값이 변경되면 반드시 UI에 알려야 한다.
이를 위해 observable
타입을 사용한다.
1 | // kotlin에서 사용되는 예시 |
Jetpack Compose에서는 이러한 콜백 함수 없이도 상태가 변경되면 자동으로 관련된 UI 요소를 재구성하도록 동작한다.
Composable 함수에서 상태 사용
stateful: Composable 함수가 값을 유지(remember)하고 있으면 stateful 함수다
1 |
|
1 | // caculation은 기억할 값을 생성하는 lambda 표현식 |
- changed 내용
1 | /** |
- Composer.cache()
1 | // invalid 값이 위에 있는 check에서 값이 변경되었을 때 true로 들어오면서 값이 변경된다. (block 람다식 재실행) |
1 |
|
상태를 갖지 않는 Composable 함수 작성
1 |
|
이 함수는 파라미터로 상태를 받지만 저장하지 않고 다른 상태를 기억하지도 않는다.
멱등성(idempotent): 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미
Composable 함수의 준수사항
빠름: Composable은 무거운 연산을 하지 말아야 한다. 웹 서비스나 어떠한 I/O도 호출해서는 안 된다. Composable에서 사용하는 데이터는 전달받는 형식이 돼야 한다.
부수 효과에서 자유로움: 전역 프로퍼티를 수정하거나 의도치 않은 observable 효과를 생산하지 말아야 한다.
멱등성:
remember { }
를 사용하지 않고(1) 전역 프로퍼티에도 접근하지 않으며(2) 예측 불가능한 코드를 호출하지 말아야 한다.(3)
상태를 갖는 Composable, 상태를 갖지 않는 Composable
상태를 갖는 Composable에서 상태를 갖지 않는 Composable을 호출하자.
1 | // stateless |
상태 호이스팅과 이벤트 전달
- 상태를 갖지 않는 Composable로 만들기 위해 상태를 상위로 이동시키는 패턴이다.
- Composable을 좀 더 재사용하기 쉽고 테스트에 용이하게 하는 것 외에도 하나 이상의 Composable 함수에서 상태를 사용하려면 상태를 상위로 올리게 할 필요가 있다.
섭씨/화씨 변경 예제
1 |
|
- 전환 후 표시되는 텍스트는 기억되었다가 result에 할당된다.
- convertedTemperature가 변경되면 result는 재평가된다. (정말?)
1 | // ... |
예상대로 remember 대상 상태값인 convertedTemperature 바뀌지 않으면 재평가(Recomposition/재구성)되지 않음을 알 수 있었다.
환경설정 변경에도 데이터 유지
Jetpack Compose는 임시로 상태를 저장하기 위해 rememberSaveable { }
사용한다.
ViewModel 사용해보기
1 | class MyViewModel : ViewModel() { |
rememberSaveable { }
으로도 간단하게 상태를 저장하고 불러올 수 있겠지만, 하나의 화면 안에서 모든 로직이 끝나는 것이 아니라 데이터를 외부에서 의존적인 형태로 받아올 때는 Saver 구현체나 ViewModel 클래스를 사용하는 것이 좋겠다.
요약
- 상태 호이스팅은 상태를 갖지 않는 Composable 함수를 만들기 위한 일종의 도구다.
remember { }
,rememberSaveable { }
,ViewModel
에 대해 알아보았다.