stateIn은 주로 Kotlin의 Flow와 관련된 개념으로, 상태를 관리하는 데 유용한 함수입니다. 이 함수는 Flow의 값을 상태로 변환하여, 상태의 변경을 관찰하고 그에 따라 UI를 업데이트할 수 있도록 돕습니다. 아래에 stateIn의 주요 특징과 사용 방법을 설명할게요.
주요 특징
- 상태 관리: stateIn을 사용하면 Flow의 값을 상태로 변환하여, 여러 컴포넌트에서 이 상태를 공유할 수 있습니다.
- 단일 출처의 진리(Single Source of Truth): 애플리케이션에서 한 곳에서 상태를 관리하고, 이를 다른 곳에서 사용할 수 있게 합니다.
- Lifecycle-aware: stateIn은 Lifecycle을 인식하여, Activity나 Fragment가 활성화된 상태에서만 값을 수집합니다.
- 재사용성: 여러 컴포넌트가 동일한 상태를 사용할 수 있도록 하여 코드의 중복을 줄입니다.
사용 방법
stateIn을 사용하기 위해서는 Flow를 생성하고, 이를 stateIn으로 변환하면 됩니다. 예를 들어:
val flow: Flow<Int> = flowOf(1, 2, 3).asFlow()
val stateFlow: StateFlow<Int> = flow.stateIn(
scope = viewModelScope, // CoroutineScope
started = SharingStarted.Lazily, // Flow가 처음으로 수집될 때 시작
initialValue = 0 // 초기 값 설정
)
매개변수 설명
- scope: StateFlow를 수집할 CoroutineScope입니다. 보통 ViewModel의 viewModelScope를 사용합니다.
- started: StateFlow가 언제 시작될지를 결정하는 매개변수로, 다양한 옵션을 제공하여 Flow의 시작 시점을 제어할 수 있습니다.
- initialValue: StateFlow의 초기값을 설정합니다.
예제
class MyViewModel : ViewModel() {
private val _count = MutableStateFlow(0)
val count: StateFlow<Int> = flow {
// 데이터 발생 로직
emit(1)
emit(2)
emit(3)
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), 0)
}
출처 : ChatGPT