در واقع callbackFlow
یک FlowBuilder در کاتلین است که به شما امکان میدهد یک فلو را از طریق یک Callback تولید کنید. حالتی که میتوانید از callbackFlow
استفاده کنید، زمانی است که یک کتابخانه یا API از Callback برای اعلام وقوع رویدادها یا بازخورد استفاده میکند و شما میخواهید این رویدادها را به صورت یک فلو در برنامه خود استفاده کنید.
حالا با یک مثال از چگونگی استفاده از callbackFlow
آشنا شویم:
import kotlinx.coroutines.*
// شبیهسازی یک کلاس LocationManager
class LocationManager {
private var locationListener: ((Location) -> Unit)? = null
// تابع برای ثبت نام listener برای بهروزرسانیهای مکان
fun registerForLocation(listener: (Location) -> Unit) {
locationListener = listener
}
// تابع برای لغو ثبت نام listener
fun unregisterForLocation() {
locationListener = null
}
// شبیهسازی یک رویداد به روزرسانی مکان
fun simulateLocationUpdate(location: Location) {
locationListener?.invoke(location)
}
}
// تعریف کلاس Location
data class Location(val latitude: Double, val longitude: Double)
// تابع ایجاد فلوی مکان
fun getLocationFlow(locationManager: LocationManager): Flow<Location> {
return callbackFlow {
// ثبت نام listener برای بهروزرسانیهای مکان
val listener: (Location) -> Unit = { location ->
// ارسال مکان به عنوان یک رویداد در فلو
trySend(location)
}
locationManager.registerForLocation(listener)
// لغو ثبت نام listener در زمان خاتمه فلو
awaitClose {
locationManager.unregisterForLocation()
}
}
}
suspend fun main() {
val locationManager = LocationManager()
// ایجاد فلوی مکان
val locationFlow = getLocationFlow(locationManager)
// اشتراکگذاری مکانها
val job = GlobalScope.launch {
locationFlow.collect { location ->
println("Received location update: $location")
}
}
// شبیهسازی رویدادهای بهروزرسانی مکان
locationManager.simulateLocationUpdate(Location(51.5074, 0.1278))
locationManager.simulateLocationUpdate(Location(40.7128, -74.0060))
// منتظر ماندن برای مشاهده خروجی
delay(1000)
// لغو شبیهسازی و شبیهسازی رویداد دیگر
job.cancel()
locationManager.simulateLocationUpdate(Location(34.0522, -118.2437))
}
خروجی:
Received location update: Location(latitude=51.5074, longitude=0.1278) Received location update: Location(latitude=40.7128, longitude=-74.006)
در این مثال، getLocationFlow
یک فلو از مکانها ایجاد میکند که به صورت یک CallBack از LocationManager
استفاده میکند. سپس با استفاده از locationFlow.collect
، ما این فلو را مصرف میکنیم و مکانهایی که از LocationManager
دریافت میشود را چاپ میکنیم. simulateLocationUpdate
توسط LocationManager
برای شبیهسازی رویدادهای به روزرسانی مکان فراخوانی میشود.