Fragment에서 StateFlow, SharedFlow, ChannelAsFlow 방출 확인

yeji·2022년 9월 5일
0

Fragment에서 Permission dialog 종료 후 값을 반환 받을 때 StateFlow, SharedFlow, ChannelAsFlow에 따라 Fragment에 반영되는 결과가 달라진다.

Activity 안에 Fragment를 만들고 그 Fragment 안에서 Activity(=dialog 역할)를 열어서 값을 전달했다.
Fragment에서 registerForActivityResult로 받아왔을 때 StateFlow, SharedFlow는 결과 값을 화면에 반영했지만, Channel에서는 반영하지 못했다.


(사진에서 하단의 OPEN NEW ACTIVITY 버튼있는 부분)
https://github.com/yezji/FlowPractice

결과 값을 소비할 때 Flow의 방출 시점이 다르다.

StateFlow

Flow는 누군가가 값을 기다리고 있는지와 상관없이 값을 반환. Channel은 receiver가 있어야만 값을 전달한다.
StateFlow는 Flow이기에 이미 방출되었지만, 최신 값을 보여주어야 하기에 다시 값을 요구하여 뷰에서 값이 출력된다.

SharedFlow

SharedFlow도 Flow이기에 받던지 안받던지 상관없이 흘려보낸다. 하지만 별도로 옵션을 설정하지 않는 이상 StateFlow처럼 최신 값을 보여주지는 않는다. -> 그래서 나오지 않는다.

Channel

Channel은 Java의 BlockingQueue 처럼 동작하여 방출되지 않고 기다리고 있다가 (Channel의 경우 suspend, BlockingQueue의 경우 blocking) 준비되면 방출하기에 뷰에서 값이 보이게 된다.

참고)
Channel vs ChannelAsFlow?

  • 소비를 cold stream(flow)로 하는 것일 뿐, 데이터 방출 자체는 hot stream(channel)이기에 사용을 기다리지 않고 한 번에 방출된다.
  • channel의 데이터 조작을 위해 Flow로 전환하여 사용
    • 사용자 입장에서 데이터 생성(filter, map)이 필요한 경우 hot stream(channel)은 적합하지 않으니 cold stream한 객체를 따로 만들 필요가 있다.
profile
🐥

0개의 댓글