일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 싱글톤
- Kotlin
- android designsystem
- 함수형프로그래밍
- El
- Abstract Factory
- 프로토타입 패턴
- 디자인패턴
- 옵저버 패턴
- PrototypePattern
- ㅓ
- builderPattern
- 추상 팩토리
- ㅋㅁ
- 코틀린
- Observer Pattern
- 팩토리 메소드
- Functional Programming
- designPattern
- 빌터패턴
- factory method
- compose
- r
- 안드로이드 디자인시스템
- F
- 디자인패턴 #
- 추상팩토리패턴
- Singleton
- Design Pattern
- material3
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
두 flow간의 전환 본문
private val growZoneFlow = MutableStateFlow<GrowZone>(NoGrowZone)
val plantsUsingFlow: LiveData<List<Plant>> = growZoneFlow.flatMapLatest { growZone ->
if (growZone == NoGrowZone) {
plantRepository.plantsFlow
} else {
plantRepository.getPlantsWithGrowZoneFlow(growZone)
}
}.asLiveData()
private val growZoneFlow = MutableStateFlow<GrowZone>(NoGrowZone)
코드는 NoGrowZone의 초깃값을 사용하여 새 MutableStateFlow를 정의합니다.
특별한 종류의 Flow 값 홀더로서, 제공된 마지막 값만 보유합니다. 스레드로부터 안전한 동시 실행 프리미티브이므로 동시에 여러 스레드에서 쓸 수 있습니다('마지막'으로 인정되는 값이 채택됨)
구독을 통해 현재 값에 관한 업데이트를 받을 수도 있습니다.
전체적으로 LiveData와 비슷하게 동작합니다. 즉, 마지막 값을 보유하며 변경사항을 관찰할 수 있습니다.
StateFlow는 예를 들어 flow{} 빌더를 사용하여 만든 일반 flow와 다릅니다.
StateFlow는 초기 값으로 생성되며 수집을 거치지 않고도 상태가 유지되고 후속 수집 간에도 상태가 유지됩니다.
MutableStateFlow 인터페이스(위의 예)를 사용하여 StateFlow의 value를 변경할 수 있습니다.
StateFlow와 유사하게 동작하는 flow은 수집될 때만 실행되는 일반 콜드 flow과는 달리 핫이라고 부릅니다.
val plantsUsingFlow: LiveData<List<Plant>> = growZoneFlow.flatMapLatest { growZone ->
.
.
.
}
StateFlow도 일반적인 Flow의 모든 연산자를 평소처럼 사용할 수 있습니다.
여기서는 LiveData의 switchMap과 정확히 동일한 flatMapLatest 연산자를 사용합니다.
flatMapLatest - growZone이 값을 변경할 때마다 이 람다가 적용되며 Flow를 반환해야 합니다.
그런 다음 반환된 Flow는 모든 다운스트림 연산자의 Flow로 사용됩니다.
기본적으로 growZone의 값을 기반으로 서로 다른 flow간에 전환할 수 있습니다.
if (growZone == NoGrowZone) {
plantRepository.plantsFlow
} else {
plantRepository.getPlantsWithGrowZoneFlow(growZone)
}
flatMapLatest내에서 growZone을 기반으로 전환합니다. 이 코드는 LiveData.switchMap 버전과 거의 같으며 LiveDatas 대신 Flows를 반환한다는 점만 다릅니다.
asLiveData 연산자는 Flow를 구성 가능한 시간 제한이 있는 LiveData로 변환합니다.
liveData 빌더와 마찬가지로 시간 제한은 기기 회전에도 흐름을 활성 상태로 유지하므로 수집이 다시 시작되지 않습니다.
StateFlow 값 변경
앱에 필터 변경을 알리려면 MutableStateFlow.value를 설정합니다. 이렇게 하면 여기서와 마찬가지로 이벤트를 코루틴에 쉽게 전달할 수 있습니다.
fun setGrowZoneNumber(num: Int) {
growZone.value = GrowZone(num)
growZoneFlow.value = GrowZone(num)
launchDataLoad {
plantRepository.tryUpdateRecentPlantsForGrowZoneCache(GrowZone(num)) }
}
fun clearGrowZoneNumber() {
growZone.value = NoGrowZone
growZoneFlow.value = NoGrowZone
launchDataLoad {
plantRepository.tryUpdateRecentPlantsCache()
}
}