#1 ๊ฐ์
combine
Returns a Flow whose values are generated with transform function by combining the most recently emitted values by each flow. It can be demonstrated with the following example: val flow = flowOf(1, 2).onEach { delay(10) }val flow2 = flowOf("a", "b", "c").o
kotlinlang.org
stateIn
Converts a cold Flow into a hot StateFlow that is started in the given coroutine scope, sharing the most recently emitted value from a single running instance of the upstream flow with multiple downstream subscribers. See the StateFlow documentation for th
kotlinlang.org
Flow์ ํ์ฅ ํจ์์ธ Flow.combine() ๋ฐ Flow.stateIn()์ ์ดํด๋ณธ๋ค.
#2 Flow.combine()
#2-1 ๊ฐ์
Flow.combine()์ 2๊ฐ ์ด์์ Flow๋ฅผ ์กฐํฉ(Combine)ํ์ฌ ์๋ก์ด Flow๋ฅผ ๋ง๋๋ ํ์ฅํจ์๋ค.
#2-2 ์กฐํฉ(combine)ํ ์ฌ๋ฃ๊ฐ ์ ๋ถ Cold Flow์ธ ๊ฒฝ์ฐ
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flow
// ์จ๋ Flow
fun tempFlow(): Flow<Int> = flow {
for (i in 33 downTo 26) {
delay(1000)
emit(i)
}
}
// ๊ตฌ๋ฆ Flow
fun cloudFlow(): Flow<String> = flow {
val cloudList = arrayListOf("๋ง์", "ํ๋ฆผ", "๋จน๊ตฌ๋ฆ", "๋ง์")
for (cloud in cloudList) {
delay(3000)
emit(cloud)
}
}
// ์ต๋ Flow
fun humFlow(): Flow<Int> = flow {
for (i in 40..70 step 5) {
delay(2000)
emit(i)
}
}
fun main() {
val combinedFlow = combine(tempFlow(), cloudFlow(), humFlow()) { temp, cloud, hum ->
"์จ๋: $temp°C, ๊ตฌ๋ฆ: $cloud, ์ต๋: $hum%"
}
CoroutineScope(Dispatchers.Default).launch {
var printCount = 0
combinedFlow.collect { result ->
println("(${++printCount}) $result")
}
}
runBlocking {
delay(20000)
}
}
/* ↑ ↑ ↑ ์ถ๋ ฅ ๊ฒฐ๊ณผ
(1) ์จ๋: 32°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 40%
(2) ์จ๋: 31°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 40%
(3) ์จ๋: 31°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(4) ์จ๋: 30°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(5) ์จ๋: 29°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(6) ์จ๋: 29°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(7) ์จ๋: 28°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(8) ์จ๋: 27°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(9) ์จ๋: 27°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 55%
(10) ์จ๋: 26°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 55%
(11) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋จน๊ตฌ๋ฆ, ์ต๋: 55%
(12) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋จน๊ตฌ๋ฆ, ์ต๋: 60%
(13) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 60%
(14) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 65%
(15) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 70%
*/
tempFlow, cloudFlow, humFlow๋ฅผ ์กฐํฉํด combinedFlow๋ผ๋ ์๋ก์ด Flow๋ฅผ ๋ง๋ค์๋ค. combinedFlow๊ฐ emit()ํ๋ ๋ถ๋ถ์ ๋ณด๋ฉด, 3๊ฐ์ Flow๋ฅผ ์ฌ๋ฃ๋ก ๋ง๋ค์๊ธฐ์ 3๊ฐ์ ๋งค๊ฐ๋ณ์(temp, cloud, hum)๊ฐ ์ฌ์ฉ๋ ๋ชจ์ต์ ํ์ธํ ์ ์๋ค.
์ด๋, tempFlow๋ ์ด 8๊ฐ์ ๊ฐ์ emit()ํ๊ณ cloudFlow๋ 4๊ฐ, humFlow๋ 7๊ฐ์ ๊ฐ์ emit()ํ๋ค. ๊ทธ๋ ๋ค๋ฉด, combinedFlow๋ ์ด 8 × 4 × 7 = 224๊ฐ์ ๊ฐ์ emit()ํ๊ฒ ๋ ๊น? ๊ทธ๋ ์ง ์๋ค. combinedFlow๋ ์ฌ๋ฃ๋ก ์ฌ์ฉํ Flow๋ค์ ๋ชจ๋ ์กฐํฉ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๋์ถํ๋ ๋ชฉ์ ์ด ์๋๋ผ, ์ต์ ๊ฐ๋ค์ ์กฐํฉ์ ์ต๋ํ ๋นจ๋ฆฌ ํ์ํ๋๋ฐ ๊ทธ ๋ชฉ์ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์, ์ฌ๋ฃ๋ก ์ฌ์ฉ๋ Flow๋ค ๊ฐ๊ฐ์ emit() ์์ ์ด ๋น์ทํ ๊ฒฝ์ฐ emit()๋ ๊ฐ์ด ๋ฌด์๋๋ ๊ฒฝ์ฐ๋ ์๊ธด๋ค. ๊ทธ๋์ ์ ์ฝ๋์ ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ๊ฐฏ์๋ 15๊ฐ์ธ ๊ฒ์ด๋ค.
#2-3 ์กฐํฉ(combine)ํ ์ฌ๋ฃ์ Hot Flow๋ ์๋ ๊ฒฝ์ฐ (SharedFlow)
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
// ์จ๋ Flow
fun tempFlow(): Flow<Int> = flow {
for (i in 33 downTo 26) {
delay(1000)
emit(i)
}
}
// ๊ตฌ๋ฆ Flow
fun cloudFlow() = MutableSharedFlow<String>()
// ์ต๋ Flow
fun humFlow(): Flow<Int> = flow {
for (i in 40..70 step 5) {
delay(2000)
emit(i)
}
}
fun main() {
val cloudFlowInstance = cloudFlow()
val combinedFlow = combine(tempFlow(), cloudFlowInstance, humFlow()) { temp, cloud, hum ->
"์จ๋: $temp°C, ๊ตฌ๋ฆ: $cloud, ์ต๋: $hum%"
}
CoroutineScope(Dispatchers.Default).launch {
var printCount = 0
combinedFlow.collect { result ->
println("(${++printCount}) $result")
}
}
CoroutineScope(Dispatchers.Default).launch {
val cloudList = arrayListOf("๋ง์", "ํ๋ฆผ", "๋จน๊ตฌ๋ฆ", "๋ง์")
for (cloud in cloudList) {
delay(3000)
cloudFlowInstance.emit(cloud)
}
}
runBlocking {
delay(20000)
}
}
/* ↑ ↑ ↑ ์ถ๋ ฅ ๊ฒฐ๊ณผ
(1) ์จ๋: 32°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 40%
(2) ์จ๋: 31°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 40%
(3) ์จ๋: 31°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(4) ์จ๋: 30°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(5) ์จ๋: 29°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(6) ์จ๋: 29°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 45%
(7) ์จ๋: 29°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(8) ์จ๋: 28°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(9) ์จ๋: 27°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(10) ์จ๋: 27°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 55%
(11) ์จ๋: 26°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 55%
(12) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋จน๊ตฌ๋ฆ, ์ต๋: 55%
(13) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋จน๊ตฌ๋ฆ, ์ต๋: 60%
(14) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 60%
(15) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 65%
(16) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 70%
*/
#2-2์ ์ฝ๋ ์ cloudFlow๋ฅผ Hot Flow๋ก ๋ณ๊ฒฝํ๋ค. ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์ ์๋ค. ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ๊ฐฏ์๊ฐ 15๊ฐ ์์ 16๊ฐ๋ก ๋ณ๊ฒฝ๋๊ธด ํ์ง๋ง, ์ด๋ ์ ์ด์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ฐ๋ณตํด์ ์คํํด๋ 1 ~ 2๊ฐ์ฉ ๋ค๋ฅด๋ค.
#2-4 Hot Flow์ ์ด๊น๊ฐ์ ๋ฆ๊ฒ ์ค๋ค๋ฉด? (SharedFlow)
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
// ์จ๋ Flow
fun tempFlow(): Flow<Int> = flow {
for (i in 33 downTo 26) {
delay(1000)
emit(i)
}
}
// ๊ตฌ๋ฆ Flow
fun cloudFlow() = MutableSharedFlow<String>()
// ์ต๋ Flow
fun humFlow(): Flow<Int> = flow {
for (i in 40..70 step 5) {
delay(2000)
emit(i)
}
}
fun main() {
val cloudFlowInstance = cloudFlow()
val combinedFlow = combine(tempFlow(), cloudFlowInstance, humFlow()) { temp, cloud, hum ->
"์จ๋: $temp°C, ๊ตฌ๋ฆ: $cloud, ์ต๋: $hum%"
}
CoroutineScope(Dispatchers.Default).launch {
var printCount = 0
combinedFlow.collect { result ->
println("(${++printCount}) $result")
}
}
runBlocking {
delay(10000) // 10์ด
println("์ด๊น๊ฐ์ ๋ณด์ ํ์ง ์์ Flow๋ฅผ ์ฌ๋ฃ๋ก combine()ํ๋ฉด ํด๋น Flow์ ๊ฐ์ด ๋ค์ด์ฌ ๋๊น์ง collect()๊ฐ ์ํ๋์ง ์์")
}
CoroutineScope(Dispatchers.Default).launch {
val cloudList = arrayListOf("๋ง์", "ํ๋ฆผ", "๋จน๊ตฌ๋ฆ", "๋ง์")
for (cloud in cloudList) {
delay(3000)
cloudFlowInstance.emit(cloud)
}
}
runBlocking {
delay(20000)
}
}
/* ↑ ↑ ↑ ์ถ๋ ฅ ๊ฒฐ๊ณผ
์ด๊น๊ฐ์ ๋ณด์ ํ์ง ์์ Flow๋ฅผ ์ฌ๋ฃ๋ก combine()ํ๋ฉด ํด๋น Flow์ ๊ฐ์ด ๋ค์ด์ฌ ๋๊น์ง collect()๊ฐ ์ํ๋์ง ์์
(1) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 65%
(2) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 70%
(3) ์จ๋: 26°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 70%
(4) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋จน๊ตฌ๋ฆ, ์ต๋: 70%
(5) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 70%
*/
#2-3์ ๊ฐ์ ์ฝ๋์ง๋ง, collecter๋ฅผ ๋ถ์ด๊ณ ๋์ 10์ด ๋ค์ Hot Flow๊ฐ ๊ฐ์ emit()ํ๊ฒ ๋ง๋ค์๋ค. ์ด๋ฌ๋ฉด combinedFlow๋ ์ด๋ป๊ฒ ์๋ํ ๊น? ์ฆ, combinedFlow๋ ๊ทธ ์ฌ๋ฃ Flow์ธ cloudFlow๊ฐ 10์ด ๋์ ์ด๊น๊ฐ์ ๋ณด์ ํ์ง ์์ ์ํ๋ก ๋ฐฉ์น๋๋ ๊ฒ์ด๋ค. SharedFlow์ธ cloudFlow๊ฐ ๊ฐ์ ๋ฐฉ์ถํ๊ธฐ ์ ๊น์ง combinedFlow.collect()๊ฐ ์คํ๋์ง ์๋ค๊ฐ, cloudFlow๊ฐ ๊ฐ์ ์ถ๋ ฅํ๋ฉด ๋น๋ก์ ์คํ๋๋ค.
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, collector๋ฅผ ๋ถ์ธ ์์ ์, cloudFlow๋ฅผ ์ ์ธํ ๋๋จธ์ง Flow๋ค์ ์ด๋ฏธ ๊ฐ์ emit()ํ๊ณ ์์์์ ์ ์ ์๋ค. ์๋ํ๋ฉด tempFlow๋ 32°C๋ถํฐ ๊ฐ์ emit()ํ๋๋ฐ, ์ถ๋ ฅ ๊ฒฐ๊ณผ์๋ ํด๋น ์จ๋๊ฐ ๋ณด์ด์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. cloudFlow๊ฐ 10์ด ๋์ ๊ฐ์ emit()ํ์ง ์๋ ๋์ ์จ๋๊ฐ 26°C๊น์ง ๋ด๋ ค๊ฐ ๊ฒ์ด๋ค.
#2-5 ์ด๊น๊ฐ์ด ํญ์ ์กด์ฌํ๋ Hot Flow๋ผ๋ฉด? (StateFlow)
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
// ์จ๋ Flow
fun tempFlow(): Flow<Int> = flow {
for (i in 33 downTo 26) {
delay(1000)
emit(i)
}
}
// ๊ตฌ๋ฆ Flow
fun cloudFlow() = MutableStateFlow("๊ตฌ๋ฆ ์ ๋ณด ์์ (์ด๊น๊ฐ)")
// ์ต๋ Flow
fun humFlow(): Flow<Int> = flow {
for (i in 40..70 step 5) {
delay(2000)
emit(i)
}
}
fun main() {
val cloudFlowInstance = cloudFlow()
val combinedFlow = combine(tempFlow(), cloudFlowInstance, humFlow()) { temp, cloud, hum ->
"์จ๋: $temp°C, ๊ตฌ๋ฆ: $cloud, ์ต๋: $hum%"
}
CoroutineScope(Dispatchers.Default).launch {
var printCount = 0
combinedFlow.collect { result ->
println("(${++printCount}) $result")
}
}
CoroutineScope(Dispatchers.Default).launch {
val cloudList = arrayListOf("๋ง์", "ํ๋ฆผ", "๋จน๊ตฌ๋ฆ", "๋ง์")
for (cloud in cloudList) {
delay(3000)
cloudFlowInstance.emit(cloud)
}
}
runBlocking {
delay(20000)
}
}
/* ↑ ↑ ↑ ์ถ๋ ฅ ๊ฒฐ๊ณผ
(1) ์จ๋: 33°C, ๊ตฌ๋ฆ: ๊ตฌ๋ฆ ์ ๋ณด ์์ (์ด๊น๊ฐ), ์ต๋: 40%
(2) ์จ๋: 32°C, ๊ตฌ๋ฆ: ๊ตฌ๋ฆ ์ ๋ณด ์์ (์ด๊น๊ฐ), ์ต๋: 40%
(3) ์จ๋: 32°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 40%
(4) ์จ๋: 31°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 40%
(5) ์จ๋: 31°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(6) ์จ๋: 30°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(7) ์จ๋: 29°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(8) ์จ๋: 29°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 45%
(9) ์จ๋: 29°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(10) ์จ๋: 28°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(11) ์จ๋: 27°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(12) ์จ๋: 27°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 55%
(13) ์จ๋: 26°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 55%
(14) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋จน๊ตฌ๋ฆ, ์ต๋: 55%
(15) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋จน๊ตฌ๋ฆ, ์ต๋: 60%
(16) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 60%
(17) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 65%
(18) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 70%
*/
๊ทธ๋ ๋ค๋ฉด, cloudFlow๊ฐ SharedFlow๊ฐ ์๋, Hot Flow์ ๋๋ค๋ฅธ ํํ์ธ StateFlow์๋ค๋ฉด? ์ด ๊ฒฝ์ฐ๋ combindFlow๊ฐ ๋๊ธฐํ๋ ์ผ์ด ์๋ค. ์๋ํ๋ฉด, StateFlow๊ฐ ์ง๋ ์ด๊น๊ฐ์ ์ฌ์ฉํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ค์ ๋ก, StateFlow๋ ๋ฆฌ์ค๋(collector)๊ฐ ์๊ธฐ๋ ์ฆ์ ์์ ์ด ๋ณด์ ํ ๊ฐ(StateFlow.value)๋ฅผ ํด๋น ๋ฆฌ์ค๋์๊ฒ ์ ๋ฌํ๋ค. ์ฆ, ์ด๋ฏธ ๋๊ตฌ๋ณด๋ค ๋น ๋ฅด๊ฒ emit()์ด ๋๋ค๋ ์๊ธฐ๋ค.
#3 Flow.stateIn()
#3-1 ๊ฐ์
fun <T> Flow<T>.stateIn(
scope: CoroutineScope,
started: SharingStarted,
initialValue: T
): StateFlow<T>
Flow.stateIn()์ Flow๋ฅผ StateFlow๋ก ๋ณ๊ฒฝํ๋ค. StateFlow๋ ์ด๊น๊ฐ์ด ์กด์ฌํ๋ ๊ตฌ์กฐ์ด๋ฏ๋ก ๋งค๊ฐ๋ณ์์ initialValue๊ฐ ์กด์ฌํ๋ ๊ฒ๋ ํ์ธํ ์ ์๋ค. ์๋๋ก์ด๋ Jetpack Compose์์ stateIn()์ combine()๊ณผ ๋จ์ง์ด๋ค. combine()๋ Flow๋ฅผ StateFlow๋ก ๋ง๋ค์ด, Jetpack Compose์์ ์ฌ์ฉํ ์ ์๋ ํํ๋ก ๋ฐ๊ฟ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
#3-2 ๊ธฐ๋ณธ์ ์ธ ์ฝ๋
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
// ์จ๋ Flow
fun tempFlow(): Flow<Int> = flow {
for (i in 33 downTo 26) {
delay(1000)
emit(i)
}
}
// ๊ตฌ๋ฆ Flow
fun cloudFlow(): Flow<String> = flow {
val cloudList = arrayListOf("๋ง์", "ํ๋ฆผ", "๋จน๊ตฌ๋ฆ", "๋ง์")
for (cloud in cloudList) {
delay(3000)
emit(cloud)
}
}
// ์ต๋ Flow
fun humFlow(): Flow<Int> = flow {
for (i in 40..70 step 5) {
delay(2000)
emit(i)
}
}
fun main() {
val combinedFlow = combine(tempFlow(), cloudFlow(), humFlow()) { temp, cloud, hum ->
"์จ๋: $temp°C, ๊ตฌ๋ฆ: $cloud, ์ต๋: $hum%"
}
val stateFlow = combinedFlow.stateIn(
scope = CoroutineScope(Dispatchers.Default),
started = SharingStarted.Lazily,
initialValue = "์ด๊ธฐํ ์ค..."
)
CoroutineScope(Dispatchers.Default).launch {
var printCount = 0
stateFlow.collect { result ->
println("(${++printCount}) $result")
}
}
runBlocking {
delay(20000)
}
}
/* ↑ ↑ ↑ ์ถ๋ ฅ ๊ฒฐ๊ณผ
(1) ์ด๊ธฐํ ์ค...
(2) ์จ๋: 32°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 40%
(3) ์จ๋: 31°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 40%
(4) ์จ๋: 31°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(5) ์จ๋: 30°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(6) ์จ๋: 29°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 45%
(7) ์จ๋: 29°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 45%
(8) ์จ๋: 29°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(9) ์จ๋: 28°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(10) ์จ๋: 27°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 50%
(11) ์จ๋: 27°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 55%
(12) ์จ๋: 26°C, ๊ตฌ๋ฆ: ํ๋ฆผ, ์ต๋: 55%
(13) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋จน๊ตฌ๋ฆ, ์ต๋: 55%
(14) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋จน๊ตฌ๋ฆ, ์ต๋: 60%
(15) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 65%
(16) ์จ๋: 26°C, ๊ตฌ๋ฆ: ๋ง์, ์ต๋: 70%
*/
๋งจ ๋จผ์ ์ด๊น๊ฐ์ด ์ถ๋ ฅ๋๋ค. ๋๋จธ์ง๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ์ด์ ๊ณผ ๊ฐ๋ค.
#4 ์์ฝ
Flow๋ฅผ ํ๋๋ก ํฉ์ณ ๋ฆฌ์ค๋(collector)๋ฅผ ๋ถ์ผ ์ ์๋ค. ํฉ์ณ์ง Flow๋ฅผ Jetpack Compose์์ ์ฌ์ฉํ๊ธฐ ์ข์ StateFlow๋ก ๋ณํํ ์๋ ์๋ค.
'๊นจ์ ๊ฐ๋ ๐ > Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Kotlin] Coroutines Flow - StateFlow (0) | 2024.08.17 |
|---|---|
| [Kotlin] Coroutines Flow - Intermediate operator (0) | 2024.08.16 |
| [Kotlin] Coroutines Flow - Back pressure์ ๊ทธ ์ฒ๋ฆฌ (0) | 2024.08.15 |
| [Kotlin] Coroutines Flow - ๊ธฐ์ด (1) | 2024.08.01 |
| [Kotlin] Coroutines - ํ Scope ๋ด์์์ ๊ณ์ธต ๊ด๊ณ (0) | 2024.07.31 |