
๐์ฐธ๊ณ ์๋ฃ
๐์ฐธ๊ณ ํ๋ฉด ์ข์ ์ง๋ ํฌ์คํ
StateFlow, SharedFlow:Flow, StateFlow is hot๐์ฐธ๊ณ ์๋ฃ
- Migrating from LiveData to Flows: An Engineerโs Guide | Kerry Bisset
- [Kotlin] Flow๋ฅผ StateFlow๋ก ๋ณํ | th.k
val myStateFlow = myFlow.stateIn( scope = lifecycleScope, started = SharingStarted.Lazily, initialValue = ์ด๊ธฐ๊ฐ )
๐์ฐธ๊ณ ํ๋ฉด ์ข์ ์ง๋ ํฌ์คํ
MutableLiveData๋ฅผ MutableStateFlow๋ก ๋ฐ๊พธ๊ธฐ!MutableLiveData์ ํน์ง:MutableStateFlow์ ํน์ง:value ํ๋กํผํฐ๋ก value get & setMutableLiveData// Observing LiveData in an Activity or Fragment
personNameLiveData.observe(this, Observer { name ->
// Update UI with the new name
})MutableStateFlowlifecycleScope ์ง์ , Lifecycle.repeatOnLifecycle ๋ธ๋ก ์ฌ์ฉ)// Collecting StateFlow in a Coroutine
lifecycleScope.launch {
personNameStateFlow.collect { name ->
// Update UI with the new name
}
}MediatorLiveData ๋ง์ด๊ทธ๋ ์ด์
๋ฐฉ๋ฒ:
์ฌ๋ฌ MutableStateFlow๋ฅผ combine/zipํ์ฌ Flow๋ก ํฉ์น๊ธฐ!
ImageSearch ํ๋ก์ ํธ SearchViewModel.kt ๋ง์ด๊ทธ๋ ์ด์ ์
private val _searchItems = MutableLiveData<List<Item>>(emptyList())
val searchItems: LiveData<List<Item>> get() = _searchItems
private val _savedItems = MutableLiveData<List<Item>>(emptyList())
val savedItems: LiveData<List<Item>> get() = _savedItems
private val _resultItems = MediatorLiveData<List<Item>>().apply {
val onChange = { _: List<Item> ->
value = searchItems.value!!.map { item ->
savedItems.value!!.find { it.id == item.id }?.let {
item.copy(folderId = it.folderId)
} ?: item.copy(folderId = FolderId.NO_FOLDER.id)
}
}
addSource(searchItems, onChange)
addSource(savedItems, onChange)
}
val resultItems: LiveData<List<Item>> get() = _resultItems
ImageSearch ํ๋ก์ ํธ SearchViewModel.kt ๋ง์ด๊ทธ๋ ์ด์ ํ
private val _searchItems = MutableStateFlow<List<Item>>(emptyList())
private val searchItems: StateFlow<List<Item>> get() = _searchItems
private val _savedItems = MutableStateFlow<List<Item>>(emptyList())
val savedItems: StateFlow<List<Item>> get() = _savedItems
private val _resultItems =
searchItems.combine(savedItems) { searchItems, savedItems ->
searchItems.map { item ->
savedItems.find { it.id == item.id }?.let {
item.copy(folderId = it.folderId)
} ?: item.copy(folderId = FolderId.NO_FOLDER.id)
}
}
val resultItems: Flow<List<Item>> get() = _resultItems