Flow는 비동기적으로 생성 및 처리할 수 있는 데이터 스트림Cold Flow는 구독을 해야지 데이터가 방출되고 Hot Flow는 구독과 상관없이 방출StateFlow(Hot Flow)으로 변환dataFlow
.stateIn(
scope = scope,
started = SharingStarted.Lazily,
initialValue = emptyList()
)
Flow에 초기 이벤트 할당Cold Flow에 사용 가능하여 구독되어야 초기 이벤트 발생dataFlow
.onStart { emit(initialValue) }
dataFlow.filterNotNull()
dataFlow.mapNotNull { it?.data }
dataFlow
.debounce(300)
.collect { query -> search(query) }
dataFlow
.sample(1000) // 1초마다 최신값 발행
Flow 결합 시 초기값 문제 해결downstream에 전달되어 불필요한 이벤트 처리 방지flowA
.combine(flowB) { a, b -> a + b }
.distinctUntilChanged()
StateFlow 또는 StateFlow으로 변환한 후 null을 할당하여 filterNotNull으로 대기 후 수신downstream에서는 항상 non-null 값만 처리onStart과 결합하면 초기 이벤트 방출 가능downstream에 전달StateFlow는 상태 관리를 위해 사용한다면 SharedFlow는 이벤트, 알림, 일회성 처리에 사용Flow 자체로는 상태를 표현하기 어렵거나, Flow 외부에서 제어해야 할 때 사용Flow 값 자체가 아닌 흐름 제어 목적으로 사용 가능(예 처음 1회만 실행)참고: Chat GPT