Kotlin Flow ve Saz Arkadaşları — Part 1
Bu makalede sizlere Coroutines Flow ve Flow için kullanabileceğimiz bazı metodlardan bahsedeceğim. Öncelikle söylemek gerekir ki burada alt başlıklar olarak vereceğim her detay için ayrı birer makale yazılabilir.
Benim anlatım tarzım, bir konuyu olabildiğince basit şekilde ve günlük hayat içerisinden örneklendirerek sunmaktır. Bu sebeple bu makalede okuyacağınız açıklamalarda bazı teknik detayları bulamayacaksınız ama önemli konular için daha detaylı okumalar yapabilmeniz için kaynaklar veriyor olacağım.
Flow için kullanabileceğimiz çok sayıda eklenti fonksiyonu ve metod olduğu için bunu bir seri olarak parça parça yazmak mantıklı olacaktır diye düşünüyorum. Girizgahı yaptıktan sonra konuya geçebiliriz :)
T.asFlow()
Bir başlangıcı ve sonu olan veri tiplerindeki (list, set, array, arrayList, iterable, sequence, range, …) değişkenimizi hızlıca Flow akışına çevirmeyi sağlayan eklenti fonksiyonudur.
MutableSharedFlow.asSharedFlow()
Değiştirilebilir (mutable) yapıda olan shared flow tipindeki değişkenimizi sadece okunabilir yapıya hızlıca çevirmemizi sağlayan eklenti fonksiyonudur.
ViewModel’dan Activity/Fragment/ComposableFunction ‘a veri akışı sağlarken sıklıkla kullanırız.
SharedFlow hakkında bir not:
- Barındırdığı verinin değişip değişmediğine bakmaksızın emit edilen her değeri akışa sunarak kendisini dinleyen tüketicilere dağıtır.
- Varsayılan bir değere gerek duymaz.
MutableStateFlow.asStateFlow()
Değiştirilebilir (mutable) yapıda olan state flow tipindeki değişkenimizi sadece okunabilir yapıya hızlıca çevirmemizi sağlayan eklenti fonksiyonudur.
ViewModel’dan Activity/Fragment/ComposableFunction ‘a veri akışı sağlarken sıklıkla kullanırız.
StateFlow hakkında ufak bir not:
— Bir veriyi akışa sunması için barındırdığı son verinin değişmiş olması gerekmektedir. Eğer son emit edilen veri bir önceki ile aynı ise
o veriyi akışa sunmaz. Aşağıdaki örneğimizde 2. kez emit edilen “B” değeri için println işlemi çalışmayacaktır.
— Varsayılan bir değere ihtiyaç duyar.
Flow.collect{ … }
Üretilmiş ve akışa sunulmuş verilerin tüketim sürecine girmesi için kullanılan en meşhur yöntemlerden biridir. Bir kuyruk mantığıyla çalışır. collect lambda’sı içerisindeki işlem tamamlandıktan sonra emit edilen diğer değer için lambda’yı tetikler.
Flow ile akan (yani emit edilen) verinin üretilme süresi, tüketilme (yani collect edilme) süresinden daha kısa olsa bile yeni değeri işleme sokmak için lambda içerisindeki işlemin tamamlanmasını bekler.
Flow.collectIndexed { … }
Eğer bir flow’dan akan verileri dinlerken verilerin bize ulaşma sıralaması -yani index numaraları- bizim için önemli ise collectIndexed metodunu kullanıp lambda içerisinde index ve value değerlerini ayrı ayrı alabiliriz. index değeri zero-based yani sıfırdan başlayacak şekilde olacaktır.
Flow.collectLatest { … }
Collect’ten farklı olarak flow ile akan (yani emit edilen) verinin üretilme süresi eğer tüketilme süresinden daha kısa ise lambda içerisindeki işlemin tamamlanmasını beklemeden iptal ederek yeni gelen değeri tüketim sürecine sokar.