Kotlin Flow Nedir?

Tuğçe Aras
4 min readDec 11, 2022

--

Selamlar 👋, gelelim Flow konusuna. Nedir?, ana bileşenleri nedir?,.. gibi başlıkları ele aldığım yazıma gelin birlikte bakalım.

Suspend fonksiyonlar asenkron bir şekilde tek bir değer döndürür. Peki asenkron olarak birden çok değeri nasıl döndürebiliriz? 🤔 İşte burada devreye Flow girmektedir.

Flow’un ne olduğuna bakmadan önce Channel nedir ona bakalım.

🔸 Channel

  • Channel, iki coroutine’nin iletişimini message passing ile sağlayan yöntemdir.

Message passing: İki coroutine arasında iletişim kanalının oluşturulup, sonucun bu kanal üzerinden gönderilip alıcı tarafına ulaştırılmasını sağlayan yöntemdir.

  • Channel oluşturulduğu anda consumer’a(ne anlama geldiğine bakacağız) gerek duymadan çalışmaya başlar. Bu yüzden hot özelliğe sahiptir ve consumer gelene kadar suspend olarak bekler.
  • Hot özelliğe sahip olması onu; herhangi bir istek yapılmasına ihtiyaç duymadan üretim yapan kaynak olmasına ve consumer tarafında meydana gelen bir hata sonucu işi bitmemiş channel’ın suspend olmasına, dolayısıyla uygulamanın boş yere resource harcamasına neden olur.
  • Flow’lar ise channel’ların hot özelliğinin cold hale getirilmişidir. Yani flow oluşturulduğu anda değil de collect yapılmaya başlandığı anda çalışmaya başlar. (collect kavramını aşağıda açıklayacağım)

Coroutine konusunu bilmiyorsanız bu konuda yazdığım yazıma bakabilirsiniz. 👇

Gelelim asıl konumuza 🥁

🔸 Flow Nedir?

  • Suspend fonksiyonların aksine, birden çok değeri sırayla yayabilen bir yapıdır. Örneğin API’dan ya da veritabanından gelen son güncellemeleri almak vb.
  • Veri akışında yer alan 3 kavrama bakacak olursak:
  1. Consumer: Akıştaki verilerl tüketir. Coroutine scope içerisinde işlem gerçekleştirilmelidir.
  2. Producer: Akışa eklenen verileri üretir.
  3. Intermediaries: Akıştaki değerleri ya da akışın kendisini değiştirebilir.

Yazımına bakacak olursak:

Flow 3 ana bileşenden oluşmaktadır. Bunlar:

  • Flow Builder
  • Operator
  • Collector

Bu kavramlara sırayla bakmadan önce bilmemiz gereken bazı kavramlar bulunmakta.

Cold flow: Talep üzerine oluşturulur. Observed edildiklerinde veri yayar.

Hot flow: Her zaman aktiftir. Gözlemlenip gözlemlenilmediklerine bakılmaksızın veri yayabilir.

https://amitshekhar.me/blog/cold-flow-vs-hot-flow

emit(): Return bir değer iletmek için kullanılır.

collect: Suspend fonksiyondur. (Arka planda bu şekilde tutulmaktadır.) Coroutine içerisinde yürütülmesi gerekir.

  • Flow’lar cold stream olarak geçmektedir. Ancak bazı operator’lar sayesinde hot stream olabilirler. Bu operator’lar: stateIn ve shareIn’dir.
  • StateFlow ve SharedFlow hot stream’dir.
  • Flow interface’i, flow’un cold stream mi yoksa hot stream mi olduğu ile ilgili bir bilgi taşımaz.
  • Flow’lar lifecycle aware değildir. Lifecycle aware olması için; StateFlow, repeatOnLifecycle ya da flowWithLifecycle ile birlikte kullanılır.
  • Flow döndüren fonksiiyonlarda shareIn ya da stateIn kullanımı, her çağrıda yeni bir Flow oluşturacaktr. Bundan dolayı kullanılması doğru değildir.
  • Flow, değer tutmaz.
  • Flow, ViewModel sınıfında kullanılmalıdır.

🔸 Collector

  • Operator’lar tarafından dönüştürülen, Flow Builder tarafından yayılan ögeleri toplar. Collector’ı, Listener olarak düşünebilirsiniz.

🔸 Flow Builders

  • 4 farklı Flow oluşturucu bulunmaktadır. En temelinde flow{} yer almaktadır. Bunlar:
  1. flowOf(): Sabit bir değerler kümesinden flow oluşturmak için kullanılır.
  2. asFlow(): Flow’a dönüştürmek için kullanılan extension fonksiyondur.
  3. flow{}
  4. channelFlow{}: Builder’ın kendisi tarafından sağlanan gönderimi kullanarak, ögelerle flow oluşturur.

Flow Builder’ı, Speaker olarak düşünebiliriz.

Yazımlarına bakacak olursak:

flowOf():

asFlow():

flow{}

channelFlow{}

https://medium.com/mobillium/kotlin-flow-livedata-77008d41643f

-> StateFlow Nedir?

  • Durum güncellemelerini yayan, gözlemlenebilir bir flow’dur. Yani amacı değişiklik olup olmadığını kontrol ederek, değer değiştiğinde bizi bilgilendirmektir.
  • Başlangıç değerine ihtiyaç duyar.
  • Tekrar aynı değeri yaymamaktadır.
  • Aynı değerin tekrarlarını filtreler.
  • Lifecycle aware değildir.

-> SharedFlow Nedir?

  • Tek seferlik event’ler göndermede kullanılmaktadır.
  • Başlangış değerine ihtiyacı yoktur.
  • shareIn fonksiyonu SharedFlow döndürür.
  • UI event’lerinde kullanılmaktadır.
  • Değişiklik olduğunda bu durumu dinleyen birden fazla collector varsa SharedFlow kullanılır.

🔸 Operators

  • Verilerin bir biçimden diğerine dönüştürülmesine yardımcı olur.
  • Operator’leri, Translater olarak düşünebiliriz.
  • Birden fazla operator bulunmaktadır. Bunlardan bazıları:

✔️ reduce

✔️ fold

✔️ debounce

✔️ buffer

✔️ zip

Daha fazlasını öğrenmek ve ne anlama geldiklerine bakmak istiyorsanız buradan bakabilirsiniz. 👇

Kaynak

gif url: The End Pool GIF by Claire Rosinkranz — Find & Share on GIPHY (2022) https://giphy.com/gifs/clairerosinkranz-pool-duck-the-end-UopqNm6oSd81BDpWrc

--

--

Tuğçe Aras
Tuğçe Aras

Written by Tuğçe Aras

Android Developer at Şekerbank T.A.Ş. 💻💚 | https://bio.link/tugcearas

No responses yet