Kotlin Coroutines 1.4 StateFlow ve SharedFlow
Kotlin'deki Flow API, sıralı olarak yürütülen bir veri akışını eş zamansız olarak işlemek için tasarlanmıştır. Esas itibariyle Flow, bir dizidir. Flow ile Kotlin'de diziler ile yapabildiğimiz transform, map, ve filter gibi işlemlerin aynısını yapabiliriz. Kotlin dizileri ile Flow arasındaki temel fark, Flow'un yürütmenin askıya alınmasına izin vermesidir.
Flow ile herhangi bir yerde askıya alma işlemi yapabilirsiniz.
Flow Kotlin Sequence'ları kadar basittir. Fakat yine de bazı durumlarda gerekli olan durum yönetimini sağlamaz. Örneğin bir process'in birden çok ara durumu ve bir son durumu olabilir. Bir dosyanın indirilmesi, böyle bir sürecin örneğidir. İndirme işlemi bir süre sürer ve ara durumları "Başladı" daha sonra "Devam ediyor" olarak belirleyebiliriz ve son durum "Başarılı" ya da "Başarısız" olabilir. Bu durumda indirmenin başarılı olup olmadığını sadece sonuçlardan anlayabiliriz.
Yukarıdaki senaryoyu Flow API kullanarak uygularken, değişikliklere göre hareket edebilecek observer'lara durum değişikliklerini yayınlamak istediğinizde Flow API ile birlikte gelen StateFlow ve SharedFlow'u kullanabilirsiniz.
StateFlow
StateFlow; StateFlow ve MutableStateFlow olmak üzere iki çeşittir.
Burada state value ile temsil edilir. Value üzerinde herhangi bir güncelleme, durum güncellemelerine sahip bir değer emit ederek tüm akış dinleyicilerine yansıtılır.
Dosya indirme örneğine StateFlow ile bakacak olursak;
Bu örnek istemcilere değişmez bir state sürümünü sunar ve değiştirilebilir state (_state) durumu dahili olarak yönetir. İndirme işlevinde, önce dahili state durum değerini güncelliyoruz: _state.value = DownloadStatus.INITIALIZED. Daha sonra iç durumu ilerlemeyi gösteren ara durum ile gösterebiliriz. Sonunda state'i indirme durumunu gösteren nihai hali ile güncelleriz.
SharedFlow
Bir durumu yönetmek yerine bir dizi durum güncellemesini, yani bir olay akışını yönetmek gerektiğinde SharedFlow kullanabiliriz. Bu API emit edilen değerler dizisiyle ilgileniyorsanız kullanışlıdır. Örneğin bir veri akışında hareketli ortalamanın hesaplanması.
SharedFlow, atomik anlık görüntü olarak kullanılabilecek tekrar önbelleğini tutan bir akıştır. Her yeni abone, önce değerleri tekrar önbelleğinden alır ve ardından yeni emit edilen değerleri alır.
Daha fazla bilgi için: https://blog.jetbrains.com/kotlin/2020/10/kotlinx-coroutines-1-4-0-introducing-stateflow-and-sharedflow/