about-mutable-state-flow

  • 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에 적용
            }
        }
  }
}