0. FlowcollectAsState()로 소비

Compose에선 collectAsState()라는 함수를 통해 Flow를 Compose 의 State로 변환 가능.

class CounterViewModel: ViewModel() {
    private val _counter = MutableStateFlow(0)
    val counter = _counter
        .onEach {
            saveCounterToDb(it)
        }
        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), 0)
}

@Composable
fun Counter() {
    val viewModel = viewModel<CounterViewModel>()
    val counter by viewModel.counter.collectAsState()
    
    Text(text = counter.toString())
}

단, Android 프로젝트에서는 해당 함수를 피하는 것이 좋음.


1. collectAsState()를 피해야 하는 이유

collectAsState() 함수는 Activity의 생명 주기에 대해서 알 수 없음.

따라서, Activity가 background로 내려가서 사용자가 UI를 보고 있지 않더라도 Flow가 여전히 실행됨.

해당 문제는 asStateFlow()로 생성된 StateFlow에는 영향을 주지 않음.

오직 stateIn()으로 생성된 StateFlow에만 영향을 끼침.


2. 해결책

collectAsStateWithLifecycle() 함수를 대신 사용.

해당 함수는 Lifecycle 에 대해 알고 있기에, 앱이 background로 내려가도 Flow가 실행되지 않음.