Sparround

Flow, StateFlow, SharedFlow — hot vs cold

Flow — asinxron dəyərlər axınıdır: suspend funksiya bir dəyər qaytarır, Flow isə ardıcıllıq emit edir.

Əsas bölgü — cold vs hot:

  • Cold flow (adi flow { }) — hər collector üçün yenidən başlayır. Collector yoxdursa, heç nə icra olunmur. Nümunə: Room-un Flow qaytaran sorğusu.
  • Hot flow (StateFlow, SharedFlow) — collector-lardan asılı olmayaraq yaşayır və emit edir; collector qoşulanda axının "ortasına" düşür.

StateFlow — həmişə cari dəyəri olan hot flow: value ilə oxunur, yeni collector dərhal son dəyəri alır, ardıcıl təkrar dəyərləri buraxır (conflation + distinct). UI state üçün standartdır.

SharedFlow — dəyər saxlamayan, konfiqurasiya edilə bilən hot flow (replay, extraBufferCapacity). Birdəfəlik hadisələr (navigasiya, snackbar) üçün istifadə olunur.

XüsusiyyətFlow (cold)StateFlowSharedFlow
Cari dəyərYoxdurHəmişə var (initial tələb olunur)Yoxdur (replay konfiqurasiya olunur)
Collector-suz işləyir?XeyrBəliBəli
Təkrar dəyər emit edir?BəliXeyr (equals ilə süzülür)Bəli
Tipik istifadəRepository/DB axınlarıUI stateBirdəfəlik event-lər

Müsahibə tələsi — event-lər üçün StateFlow: snackbar mesajını StateFlow-da saxlasan, ekran döndükdə yeni collector son dəyəri yenidən alır və snackbar təkrar görünür. Birdəfəlik event-lər üçün SharedFlow(replay = 0) və ya Channel işlədilir. UI-da toplama isə repeatOnLifecycle(Lifecycle.State.STARTED) içində olmalıdır — yoxsa arxa planda da collect davam edir.

🛠 Tapşırıq

Bir MutableStateFlow<String> və bir MutableSharedFlow<String> (replay = 0) yarat.

  • Hər ikisinə dəyər emit et, sonra collector qoş — hansının dəyəri gördüyünü qeyd et.
  • StateFlow-a eyni dəyəri iki dəfə emit et — collector neçə dəfə işə düşür?
  • flow { } cold flow yaz, iki collector qoş və emissiyaların təkrarlandığını gör.

Bitdi sayılır: "snackbar mesajını niyə StateFlow-da saxlamaq olmaz" sualına öz təcrübənlə cavab verirsənsə.

📚 Mənbələr və sənədlər