728x90
반응형
Jetpack Compose의 리컴포지션
Jetpack Compose는 상태(State)가 변경될 때 컴포저블 함수가 다시 호출되는 방식으로 UI를 업데이트합니다. 이를 리컴포지션(recomposition)이라고 합니다. 컴포저블 함수가 다시 호출될 때마다 내부의 모든 코드가 다시 실행됩니다. 따라서, 리컴포지션이 발생하면 모든 상태와 로직이 초기화될 가능성이 있습니다.
LaunchedEffect
LaunchedEffect는 컴포저블이 처음 컴포즈될 때 또는 키가 변경될 때 지정된 블록 내의 코드를 실행하는 컴포저블 함수입니다. 키는 LaunchedEffect의 동작을 제어하는 중요한 요소입니다. 이 키를 사용하여 어떤 조건에서 이 블록이 재실행될지를 결정할 수 있습니다.
Unit 키 사용
Unit은 코틀린에서 특별한 객체로, 아무런 정보를 담지 않으며 단일 인스턴스만 존재합니다. 따라서 Unit은 변경될 수 없는 값이므로, 키로 사용하면 다음과 같은 동작이 발생합니다:
- 초기 컴포지션: 컴포저블이 처음 컴포즈될 때 LaunchedEffect(Unit)이 호출되고 블록 내의 코드가 실행됩니다.
- 리컴포지션: 상태 변경 등으로 인해 리컴포지션이 발생해도 Unit 키는 변하지 않습니다. 따라서 LaunchedEffect는 재실행되지 않습니다.
LaunchedEffect(Unit) {
// 실행할 코드
}
예제 코드
@Composable
fun ListContainer(navHostController: NavHostController) {
val context = LocalContext.current
var pIndex by remember { mutableIntStateOf(1) }
val list = remember { mutableStateListOf<Data>() }
// 처음 컴포즈될 때 한 번만 실행되는 로직
LaunchedEffect(Unit) {
getPosts(context, list, pIndex)
}
LazyColumn(){
}
}
이렇게 하면 getPosts 함수는 ListContainer가 처음 컴포즈될 때 한 번만 호출되고 pIndex, list 데이터가 변경되서 리컴포지션 시에는 호출되지 않게 됩니다.
728x90
반응형
'개발 > 안드로이드앱' 카테고리의 다른 글
[Jetpack Compose] java.lang.IllegalArgumentException: Can't put value with type class 에러 해결 (0) | 2024.07.06 |
---|---|
진동 마사지 앱 개발 및 출시 (0) | 2024.06.28 |
구글 플레이 콘솔 앱 등록 실패 수정(잘못된 개인정보처리방침) (0) | 2024.06.25 |
진동세기가 안 변하는 현상 (0) | 2024.06.20 |