Dove Letter의 25년 2월 3일 아카이빙 된 내용 중 흥미로운 글을 발견했다. compose에서 상태를 UI에 바인딩할 때 사용되는 API 중 하나인 CollectAsState( )가 Dispatchers.Main를 사용하고 있다. 이로 인해 상태를 상태를 디스패치하는 과정에서 UI에 도달할 때마다 비동기적으로 상태를 전달하기 때문에 새로 업데이트된 상태와 UI의 동기화 문제가 발생할 수 있다.
이 문제는 context 인자에 Dispatcers.Main.immediate를 전달함으로써 해결할 수 있다. 하지만 2025년 2월 5일 기준으로 이 문제를 위해 추가된 API가 있다 하니 간단하게 알아보자.
val uiState = viewModel.uiState.collectAsState(Dispatchers.Main.immediate)
LocalCollectAsStateCoroutineContext
우선 해당 이슈에 관한 문제는 Issue Tracker에서 확인할 수 있다.
변경 이전 CollectAsState는 EmptyCourtineContext를 인자로 받고 있었다.
이 부분이 LocalCollectAsStateCoroutineContext로 변경되었는데 LocalCollectAsStateCoroutineContext라는 프로퍼티 자체가 새로 추가된 것을 확인할 수 있다. LocalCollectAsStateCoroutineContext는 CompositionLocal을 사용해 CoroutineContext 를 전달할 수 있도록 구현되어 있다.
CompositionLocal : 하위 컴포저블에서 상위 컴포저블의 상태에 접근할 수 있게 만드는 일종의 컨테이너
어떻게 활용하면 좋을까?
해당 이슈 픽스가 완료된 것은 25년 2월 5일, Compose 공식문서에 나온 최신 업데이트 날짜는 25년 1월 29일로 아직 릴리즈 되지 않은 것 같다. 또한 CollectAsState 외에도 CollectAsStateWithLifecycle에선 어떤 식으로 사용할 수 있을지 궁금해지는데 정식 릴리즈가 된다면 테스트 해봐야겠다.
'Android' 카테고리의 다른 글
ViewModel의 One Time Event를 다루는 다양한 솔루션 (0) | 2025.02.07 |
---|---|
안드로이드에서 실시간으로 네트워크 상태를 대응해보자 (2) | 2024.09.15 |
안드로이드 접근성 개선기 (0) | 2024.08.26 |
안드로이드 리사이클러뷰 성능 개선 일지 4편 (0) | 2024.08.11 |
안드로이드 리사이클러뷰 성능 개선 일지 3편 (0) | 2024.08.10 |