Flow를 collectAsState()로 소비Compose에선 collectAsState()라는 함수를 통해 Flow를 Compose 의 State로 변환 가능.
Flow → collectAsState() → Stateclass 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 프로젝트에서는 해당 함수를 피하는 것이 좋음.
collectAsState()를 피해야 하는 이유collectAsState() 함수는 Activity의 생명 주기에 대해서 알 수 없음.
따라서, Activity가 background로 내려가서 사용자가 UI를 보고 있지 않더라도 Flow가 여전히 실행됨.
해당 문제는 asStateFlow()로 생성된 StateFlow에는 영향을 주지 않음.
오직 stateIn()으로 생성된 StateFlow에만 영향을 끼침.
collectAsStateWithLifecycle() 함수를 대신 사용.
해당 함수는 Lifecycle 에 대해 알고 있기에, 앱이 background로 내려가도 Flow가 실행되지 않음.