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의 방출 시점이 다르다.
Flow는 누군가가 값을 기다리고 있는지와 상관없이 값을 반환. Channel은 receiver가 있어야만 값을 전달한다.
StateFlow는 Flow이기에 이미 방출되었지만, 최신 값을 보여주어야 하기에 다시 값을 요구하여 뷰에서 값이 출력된다.
SharedFlow도 Flow이기에 받던지 안받던지 상관없이 흘려보낸다. 하지만 별도로 옵션을 설정하지 않는 이상 StateFlow처럼 최신 값을 보여주지는 않는다. -> 그래서 나오지 않는다.
Channel은 Java의 BlockingQueue 처럼 동작하여 방출되지 않고 기다리고 있다가 (Channel의 경우 suspend, BlockingQueue의 경우 blocking) 준비되면 방출하기에 뷰에서 값이 보이게 된다.
참고)
Channel vs ChannelAsFlow?