Frontend/Android

Flow usage pattern

Roiei 2025. 6. 19. 08:57
반응형
var items: Flow<List<Item>> = ...

items.map { list ->
    list.filter { it.type == REGULAR }.sortedWith(
        compareBy {
            if (type.sortOrder == SortOrder.NAME) it.name else it.value
        },
    )
}

Flow가 List을 emit 하는데, emit 하는 List에 대해서 뭔가 처리하고 나서 이를 collect 하는 곳으로 보내기 위한 중간(intermediary) 과정의 동작을 구현하는 부분이 map

Flow의 map 연산자는 항상 Flow를 반환
그래서 결과는 다시

Flow<List<Item>>임

#


Flow의 collect는 코루틴 내에서 실행되어야 함
그래서 다음과 같이 구현하기도 함
// 1. null이 아닌 경우 collect
flow?.let {
    collectStations(it) { list ->
        ...   
    }
}

{ ... } 부분이 tailing lambda로 callback 매개변수에 전달됨

// 2. collect는 코루틴 내에서 수행
collectStations(flow: Flow..., callback: (List<MediaItem>) -> Unit) {
    aJob?.cancel()
    aJob = viewModelScope.launch(Dispatchers.IO) {
        flow.collectLatest(callback)
    }
}

flow에서 collect 시 마다 수신 받은 데이터에 대해 callback을 호출


이때 collectLatest에 callback을 넘겼으나, 다음과 같이 trailing lambda로 넘길수도 있음

collectLatest { it ->
    ...
}
반응형