Shunz Android Dev Note

코틀린의 반응형 프로그래밍 #4 - StateFlow 본문

Kotlin

코틀린의 반응형 프로그래밍 #4 - StateFlow

_Shun_ 2023. 11. 28. 23:29

 

마지막으로 다루게 될 Flow 타입은 SharedFlow의 하위 항목인 StateFlow입니다. SharedFlow에 대해 자세히 알아보려면 여기서 이전 게시글을 확인해주세요. 이제 StateFlow를 특별하게 만드는 방법에 대하여 알아보겠습니다. 아래 다이어그램을 바로 이해하지 못하더라도 본 게시글을 모두 읽어 보셨다면 충분히 이해 할 수 있을것으로 기대합니다.

 

https://medium.com/@paritasampa95/stateflow-in-android-812e4d82cac5

 

 

StateFlow는 특별한 SharedFlow

Flow와 SharedFlow의 차이점과는 다르게, SharedFlow와 StateFlow는 매우 많은 공통점이 있습니다. 사실, 특별한 속성들(properties)을 가지는 SharedFlow를 만들어서 독자만의 StateFlow를 만들 수 있습니다. 먼저 replay value를 1로 설정하여 가장 최근의 단일 값만 subscriber에 재전송합니다. 그 다음 버퍼 정책을 DROP_OLDEST로 설정하여 버퍼의 유일한 항목이 현재 값이 되도록 합니다. 그런 다음 즉시 초기값을 tryEmit()을 통하여 방출을 시도합니다. 마지막으로 distinctUntilChanged() 연산자를 적용합니다.

이 과정이 StateFlow에 대해 알아야 할 가장 중요한 사항을 다룹니다.

  • 구독자에게 재생되는 단일 값을 고정합니다.
  • 값은 항상 초기 값 또는 가장 최근에 업데이트된 값 중 하나입니다.
  • 새 값은 현재 값과 구분되는 경우에만 구독자에게 알립니다.

 

StateFlow의 사용

StateFlow는 MutableStateFlow 생성자를 사용하거나 Flow에 적용된 stateIn()을 사용하여 생성됩니다.

val mutable = MutableStateFlow(initialValue = "안녕!")
val stateFlow = mutable.asStateFlow()

val myFlow = flowOf(1,2,3)
val flowSharedFlow = myFlow.stateIn(
    scope = coroutineScope, 
    started = SharingStarted.Lazily, 
    initialValue = "Hello"
)

 

버퍼 정책은 일시 중단 정책이 아닌 드롭 정책이기 때문에 tryEmit() vs emit() 과 같은 선택권이 없습니다. 대신 값이 직접 업데이트되거나, update() 함수를 사용하여 업데이트됩니다. 두 함수 모두 매우 유사하게 작동하지만 update() 함수 및 형제(updateAndGet, getAndUpdate)는 값에 대한 원자 연산이므로 까다로운 race conditions를 방지합니다.

val myFlow = MutableStateFlow("안녕!")

myFlow.value = "굳바이~"

myFlow.update { current ->
  // 새로운 값을 이 블록에 할당
  current + " 내일 만나!"
}

println(myFlow.value) // "굳바이~ 내일 만나!"

 

다른 모든 Flow 타입과 마찬가지로 터미널 연산자를 사용하여 StateFlow를 수집할 수 있지만, .value 속성을 사용하여 최신 값에 액세스할 수도 있습니다.

val stateFlow = MutableStateFlow("안녕!").asStateFlow()

// 값을 구독.
stateFlow.collect { ... }

// 현재의 값을 가져와서 currentValue에 할당.
val currentValue = stateFlow.value

 

 

결론

StateFlow의 모든 기능은 상태 관리에 탁월한 옵션이며 Android Jetpack Compose에서 사용할 상태를 노출하는 데 선호되는 객체입니다.반응성의 힘과 결합하여 쉽게 접근할 수 있는 단일 현재의 값은 StateFlow를 두 세계에서 최고로 만듭니다.

 


 

 

지금까지 코틀린의 반응형 프로그래밍 시리즈를 읽어주셔서 감사합니다.