Groo
stateIn을 사용하여 Flow를 StateFlow로 변환 본문
반응형
아래 내용은 모두 해당 원글을 기반으로 요약정리한 내용입니다.
그림은 저자가 직접 제작한 것임을 알려드립니다. (출처: 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가 무엇인지 항상 궁금했는데 자세히 알게되어서 재밌었다.
오늘도 수고했다 🥱
반응형
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
collect와 collectLatest의 차이 (0) | 2022.04.03 |
---|---|
buffer를 활용하여 발행자와 소비자의 Coroutine 분리 (0) | 2022.04.02 |
Flow와 StateFlow의 차이 (0) | 2022.03.27 |
Flow 기본 개념 (0) | 2022.03.26 |
Kotlin 코틀린의 클래스와 객체 (5) | 2020.12.30 |
Comments