În timp ce o funcție de suspendare simplă returnează o singură valoare asincronă, aplicațiile moderne necesită adesea procesarea unui flux continuu de date în timp real (coordonate GPS, cotații bursiere, mesaje chat sau modificări ale bazei de date).
Kotlin Flow (parte din biblioteca kotlinx.coroutines.flow) reprezintă standardul reactiv nativ pentru Kotlin, înlocuind framework-urile externe greoaie precum RxJava cu un model simplu, compatibil cu corutinele.
Cold Stream (Flow) vs. Hot Stream (StateFlow)
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.*
// 1. COLD STREAM (Flow):
// Codul din interiorul flow { ... } NU rulează până când cineva nu apelează o metodă terminală (collect)!
fun monitorizeazaSenzorTemperatura(): Flow = flow {
var temp = 20.0
while (true) {
emit(temp) // Emitem valoarea curentă către consumatori
delay(1000)
temp += 0.5
}
}
// 2. HOT STREAM (StateFlow):
// Rulează continuu în memorie, menține ultima stare emisă și o notifică tuturor abonaților activi.
// Este modelul standard recomandat de Google pentru arhitecturile de UI (Jetpack Compose / ViewModel):
class SenzorViewModel {
private val _stareUI = MutableStateFlow("Inițializare...")
val stareUI: StateFlow = _stareUI.asStateFlow()
fun actualizeaza(nouaStare: String) {
_stareUI.value = nouaStare // Modificarea stării re-randează UI-ul automat
}
}
suspend fun main() = coroutineScope {
// Colectarea datelor cu operatori funcționali curați:
monitorizeazaSenzorTemperatura()
.filter { it > 21.0 }
.map { "Temperatură critică: $it °C" }
.take(3)
.collect { mesaj ->
println(mesaj)
}
}
StateFlow vs. SharedFlow: Când și Ce Alegem?
| Caracteristică | StateFlow<T> |
SharedFlow<T> |
|---|---|---|
| Păstrare Stare | Menține întotdeauna ultima valoare emisă (value). |
Nu păstrează starea implicit (emite doar mesaje noi). |
| Valoare Inițială | Obligatorie la instanțiere. | Nu necesită valoare inițială. |
| Scenariu Optim | Starea ecranului de UI (ex: încărcare, date disponibile, eroare). | Evenimente unice (Toast notifications, mesaje SnackBar, navigare). |