- Flow: 단방향 비동기 stream으로 값을 emit 할 수 있고, 그것을 collect 할 수 있다.
- StateFlow: Flow의 확장으로 마지막 값을 저장한다.
- MutableStateFlow: StateFlow에서 값을 수정할 수 있다.
활용
MutableStateFlow를 사용해서 react의 state처럼 사용할 수 있다. 즉 ViewModel에서 state를 수정하면, Activity에서 그것을 구독하여 화면을 수정하는 방식이다.
// UI를 그릴 때, 필요한 정보들을 담고 있다.
data class FollowUiState(
val users: List<User> = emptyList(),
val followerCount: Int = 0,
val followingCount: Int = 0,
val isLoading: Boolean = false,
val error: String? = null,
val currentType: UserType = UserType.FOLLOWER,
val sort: SortType = SortType.NAME_ASC
)
// State를 비즈니스 로직에 따라 수정한다.
@HiltViewModel
class FollowViewModel @Inject constructor(
private val followUseCase: FollowUseCase
) : ViewModel() {
private val _uiState = MutableStateFlow(FollowUiState())
val uiState: StateFlow<FollowUiState> = _uiState.asStateFlow()
}
// State의 변경을 감지하여, 화면에 그린다.
@AndroidEntryPoint
class FollowListActivity: AppCompatActivity() {
fun onCreate() {
...
lifecycleScope.launch {
followViewModel.uiState.collect { state ->
// state를 UI에 적용
}
}
}
}