Flow؛ جریان داده مثل شیر آب کنترلشده
وقتی داده یکییکی و در طول زمان میاد، Flow میگه بده به من مرتبش کنم.
Flow برای چند مقدار async
تابع suspend معمولاً یک مقدار برمیگردونه؛ Flow میتونه چند مقدار رو در طول زمان منتشر کنه. مثل پخش زندهی دادهها؛ نه یک عکس ثابت.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun numbers(): Flow<Int> = flow {
emit(1)
emit(2)
emit(3)
}
fun main() = runBlocking {
numbers().collect { value ->
println(value)
}
}
1 2 3
transform با map و filter
Flow هم مثل collectionها `map` و `filter` داره، فقط async و مرحلهای کار میکنه. داده میاد، صاف میشه، خوشگل میشه، میرسه به UI.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
numbers()
.filter { it % 2 == 1 }
.map { it * 10 }
.collect { println(it) }
10 30
catch برای خطا
جریان داده ممکنه وسط راه خطا بده. با `catch` محترمانه هندلش کن؛ نذار برنامه با لگد بیفته بیرون.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
flow {
emit(1)
error("مشکل در دریافت داده")
}
.catch { e -> emit(-1) }
.collect { println(it) }
1 -1
نتیجه این درس 🎯
Flow برای دادههایی است که یکییکی و در طول زمان میآیند. وقتی سرچ زنده، وضعیت شبکه، دیتابیس یا event داری، Flow از callbackهای شلخته نجاتت میدهد.
تمرین! 🧠
Flow بساز که اعداد ۱ تا ۵ را emit کند، فقط زوجها را چاپ کن.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
flow {
for (i in 1..5) emit(i)
}
.filter { it % 2 == 0 }
.collect { println(it) }
}
2 4