Groo

stateIn을 사용하여 Flow를 StateFlow로 변환 본문

프로그래밍 언어/Kotlin

stateIn을 사용하여 Flow를 StateFlow로 변환

김주엽 2022. 4. 2. 00:32

아래 내용은 모두 해당 원글을 기반으로 요약정리한 내용입니다.

그림은 저자가 직접 제작한 것임을 알려드립니다. (출처: Kt World)


리액티브 프로그래밍에서는 종종 여러 데이터 흐름을 하나로 합쳐 단일 Flow를 만들어 내기도 한다.

 

이런 Flow를 UI에서 사용하기 위해서는 StateFlow로 변환을 해주어야 한다.

우리는 이를 stateIn 함수를 통해 변환할 수 있다.

 

stateIn 함수는 아래 세 가지 파라미터를 전달 받는다.

fun <T> Flow<T>.stateIn(
    scope: CoroutineScope, 
    started: SharingStarted, 
    initialValue: T
): StateFlow<T>
  • scope: StateFlow가 Flow로부터 데이터를 구독 받을 CoroutineScope를 명시한다.
  • started: Flow를 언제부터 구독할지 명시한다.
  • initialValue: StateFlow에 저장될 초기 값을 명시한다.
val numberFlow: Flow<Int> = flow {
    for (i in 0..100) {
        emit(i)
        Log.d(TAG, i.toString())
        delay(1000)
    }
}

val numberStateFlow: StateFlow<Int> = numberFlow.stateIn(
    scope = viewModelScope,
    started = SharingStarted.WhileSubscribed(10000),
    initialValue = 0
)

SharingStarted의 종류로는 아래 세 가지가 존재한다.

  • Eagerly: 구독자가 존재하지 않더라도 즉시 Flow를 구독한다. (구독을 끝까지 중지하지 않음)
  • Lazily: 최초 구독자가 생성 후부터 Flow를 구독한다. (구독을 끝까지 중지하지 않음)
  • WhileSubscribed(stopTimeoutMills, replayExpirationMillis): 최초 구독자가 생성 후부터 Flow를 구독한다.
    • StateFlow의 마지막 구독자가 사라졌을 때 Flow 구독을 중지한다.
    • stopTimeoutMills: StateFlow의 구독자가 모두 사라진 이후에 정지할 delay를 넣을 수 있다.
    • replayExpirationMills: StateFlow의 replay를 위해 이전에 캐싱한 값을 유지할 시간을 넣을 수 있다.

이렇게 stateIn을 활용해서 Flow를 StateFlow로 변환하는 방법에 대해서 배웠다.

SharingStarted가 무엇인지 항상 궁금했는데 자세히 알게되어서 재밌었다.

오늘도 수고했다 🥱

Comments