[Compose] 6. Side-effects - LaunchedEffect, rememberCoroutineScope, rememberUpdatedState, DisposableEffect, SideEffect, produceState, derivedStateOf, snapshotFlow

State → Flow 변환


snapshotFlow 는 State를 Flow로 변환하기위해 사용한다.

Flow → State 로 변경하는 Flow.collectAsState() 와 반대되는 기능이다.

Flow.collectAsState() : Flow → State

snapshotFlow() : State → Flow

이렇게 State → Flow 로 변환하면, Flow의 다양한 연산자들을 사용하여 좀더 효율적인 코드를 구성할 수 있게된다.

snapshotFlowcollect 를 시작하면, 파라미터 블록을 실행하고 실행된 State 객체의 결과를 방출한다.

LazyColumn 에서 첫 번째 아이템이 스크롤로 인하여 가려지면, 특정 작업을 수행하는 예제

val listState = rememberLazyListState()

LazyColumn(state = listState) {
		// ...
}

//listState 가 변경되면 내부 블럭이 실행된다.
LaunchedEffect(listState) {
		
		//listState.firstVisiblerItemIndex는 Flow 연산자를 사용할수 있는 Flow로 변환된다.
		snapshotFlow { listState.firstVisibleItemIndex }
			.map { index -> index > 0 }
			.distinctUntilChanged()
			.filter { it == true }
			.collect {
					MyAnlyticsService.sendScrolledPastFirstItemEvent()
			}
}