이전 포스트에서 cold stream과 hot stream을 다루었다.
이번에는 hot stream(flow)인 stateflow와 sharedflow를 다루고자 한다.
SharedFlow의 내부는 다음과 같이 구성된다
interface SharedFlow<out T> : Flow<T> {
...
}
StateFlow의 내부는 다음과 같이 구성된다
interface StateFlow<out T> : SharedFlow<T> {
/**
* The current value of this state flow.
*/
public val value: T
}
구현 관계를 보면 SharedFlow는 StateFlow의 추상화된 버전이다.
정리하자면 Flow들은 다음과 같은 계층 구조를 가지고 있다.
Flow <- SharedFlow <- StateFlow
private val _stateFlow = MutableStateFlow("Hello")
val stateFlow = _stateFlow.asStateFlow()
fun triggerStateFlow() {
_stateFlow.value = "StateFlow"
}
StateFlow는 LiveData와 유사하지만 다른 점이 state를 가질 수 있다는 것이다. 그래서 초기값이 필요하다.
private val _sharedFlow = MutableSharedFlow<String>()
val sharedFlow = _sharedFlow.asSharedFlow()
fun triggerSharedFlow() {
viewModelScope.launch {
_sharedFlow.emit("SharedFlow")
}
}
SharedFlow는 이벤트 형태로 값을 전달한다.
activity에서 state를 변화시키고 이를 Toast로 출력
with(binding) {
btnStateflow.setOnClickListener { viewModel.triggerStateFlow() }
btnSharedflow.setOnClickListener { viewModel.triggerSharedFlow() }
}
// stateflow
lifecycleScope.launch {
viewModel.stateFlow.collectLatest {
Toast.makeText(this@MainActivity, it, Toast.LENGTH_SHORT).show()
}
}
// sharedflow
lifecycleScope.launch {
viewModel.sharedFlow.collectLatest {
Toast.makeText(this@MainActivity, it, Toast.LENGTH_SHORT).show()
}
}