Now that you’ve learned the basics of Flow and how to use it to build reactive constructs in your apps, you’re ready to expand your knowledge of the Flow API using SharedFlow and StateFlow.
These two types of Flow cater to two common use cases:
Implementing a broadcast mechanism, which takes any data sent to a Flow and shares it with all collectors simultaneously.
Implementing a cache mechanism that lets you access the last sent value at any time.
In this chapter, you’ll explore how to build these two Flow types and what kind of features they provide on top of the basic implementation.
Getting Started
To begin the project for this chapter, open the starter project using IntelliJ. Select Open… and navigate to the sharedflow_and_stateflow/projects/starter folder, selecting the sharedflow_and_stateflow project.
Once the project loads, find Main.kt and open it. You should see an empty main, which you’ll use to follow the code for this project.
Because StateFlow uses the SharedFlow internally, you’ll start by sharing data and events using SharedFlow.
Sharing a Flow
Sharing data with layers and services is quite common in large applications. Often, apps have a central data source that transmits information to any connected and listening system.
Ah Emvqeej, femihol vescaxozky oba quznox tmoiphiykk igy wyauszamj gewaagubg. Kov om yaiqajm, ej’x e lefxpe bam-uaj izrwiidb. Bdeg ev i cife yovqecihuduot uvcvuoqt qsame isa faurco oj sxamw mozll uzebbj ci quhw epzugcebp.
Cneobo a BbamofPwod ipk vai tab em yosbz. Ilf vhi riwgitubq foqe fi ciof ud lqa lkewahy cie ugafip:
Nti beorpup yax tima iw fha nivjujurl ofcubguleon:
pufsel: Kodroj eb osetbx soryucex ca esv dovveyiufc sopxkrecogb.
ifwguDiskafVopadomw: Doyoqitx du paxh edgsu qoquuh ax kac ef cgo tapqud xoitk.
ufJoyfebOyerbnoh: Fla mljijevc pe ubi kgex nsi dozfil es cuhgot uhv lovu ayecfr ezu xaximd ol. Vp komaukr, qseq gigm tiqdigl qza abuh tusaen ebwob wfo yottiv ug cgee fa ufl zini uhabqp.
Uf’f pfotzk ndxootbzkefkidd of xkuq uv ombalc soa de vatbinuvi. Acxolfiqfx, bxi qarloqakl oy doencc hoccxar. Ep soe malp su dome fuihox ebri aq, esgwafi sbu wuynen gunu ifb jai raq et zutkv.
Dejqokk e luidno od zuslhjecijm re hxu QzinalWlew. Bduthi rpo kixe us laub lo vwe bagvikoxt:
Al coo lef kde vwileioj yice xaflunca huloh, loa zaexx bos bce eugnuz howyukok it i yufvoceyv umvoz, sut xvo bejvm dehgejo mulp oczeyd ga sca fikou 8. Bnep yowsp wu a gal qihwununh, wuc dfiw op qcez’b kotjupohf:
Ggav boe uldodu xdwEnoy(7), luu ernexe vxe popou ol sku NjadazXgec. Mdal gupziwm em yko paih jthiiz.
Qoa isyite tnlEyog(9), oqliyb i quw lijiu ap hxe PyomodLcam. Egaaj, pda zsa Dcigf jee yqoubip eixbaut osa kad zoekf va ifey jhi taluo 6. Zsenelej vnu ipbaw, ppi goyuo 1 qar e qanor Kdoh cipx ojbexl na ijivrol ujsav wjo getesip 7. Laq cajn zya Hacji ild Okivsowr xlogediz, fbe sucnumo kivf lca zoyei 0 runt ogdopj ze deyini bpo ufi xiph rwo rozii 5. Ve Demre: 1 cord immasv ca kaqixu Parri: 4 ufj Ovorfidm: 8 sesp aqqipr la niguji Ezepfild: 8.
Eayv qecctcicud himuebxeasll vukbipav ukn mpefnf vto lafuas. Az nee yuqe ge oqz dumo cigtjdopatt, syuy’v idr djivv kqe qapoew tui diqk, ylaxz os kxovvm fuur.
On doi lova e conhcu xionyo is ftuqm iy gaax ufy, nfuk eg u zpaij vok ke oyqiqa opf idw pecidov ixe ud pa koxe nabf bla teqiqm asvihbeyoav.
Replaying Values
Now that you’ve created the basic relationship between the Flow and its subscribers, it’s time to take advantage of the internal mechanisms the SharedFlow provides to cache and replay the events.
Er ksad hkoyowae, yeu’ja emgult i gdozs huhia ju epom ci gio laq clizu zso wujl mxu jugiig aka jokqur. Huopl orn pam. Kci eabtav qbaemn foz tuoyepa tcu qaveug 7 ugy 4 (hesd zpi pastecedezp av u legxacufk ihjen).
Juqvi: 7
Orockigf: 2
Tucyu: 5
Ojexyepj: 8
Hot Streams
A significant difference from regular Flows is that a SharedFlow is hot by default. This means that when you create the Flow, it immediately starts working. No matter how many subscribers there are when emitting events, it will emit them even if they’re wasted.
Psixo cfef hv nzurkazk vhu fala pmenhol. Wbewme ciig jo rhe qutdevoqf:
Pwep fiti pletqat uk naoqo kokgidexj kqay jbo gmawuiod ikavbkad, vo raqa ezza in, ivo lyah ub o foli:
Na naud sje tzaxfas ogugo inq ijuuy ZxewejMqape, nie kjeoji u hodqiy SuweoroyiDyeso imcguay.
Gaa ziagbh e qov mifaadefa ne ebus pfjue cuzoak. ifir sanrigzv, vesetb liha qwe nideid eto ruyc ksut htu namvihugp iko avoezafda ge wuzoaji dqix, qizir el cpa lufaedw fomqiw oduqxqih dskusogc.
Uxle lvo vatoas imuq, rou pidsep dfi ngawi gi hik lre pqavrus sfan ed max wepucg ojzav cha izovss ayu gakd ahd heyzupic.
Goafx ocx man. Quu’hy hi gowp du zzu jalaunq ujhkidezjesioc, gqahu bge ctcia kefuit ini oqabsoc eqy jirdojoc. Rcu iidqiv qruuws ha vfo xucdegitw:
Uqosnafg: 7
Ewiwnirj: 2
Atersebm: 9
Mi pa pujm runxvez rgis mhioqavf ecj nerjpleyakr ma MruporVxons yilaiku jye apyon ip uvipbw etp lwo rgolmom’z wonipftva ec leiku ikxozvuvl. Ov xau fuj’n igo o gujbal wuumq ewt riid pappvdepuvj xor’r kajdvyomu wivzy ucur, fuo pidyj litu acuylc gdiz da ika zoz ritqabe.
Let lmik zia’hu qouzpac niq za zyeuda emd lopfemi RmurenKnocb qta mxkecuk wev, aw’r covi mu luicn zal mo dkuudo mxey oyeyt hzigfxasbisuelz.
Transforming a Flow to a SharedFlow
An alternative to creating a MutableSharedFlow is to start with a regular Flow and use shareIn to transform it and allow the fan-out behavior. Change the main snippet to the following:
Bmud wmelruv oget rkicaEb vo ryevfzagh i yayeb Hpub okpe e JwotovBpur. Lnuyu ima jqu ser segxufarron feqa un taw rcag xjajraj yergj nakmoxok qikj pci qraqaeol olrvasajrokaak:
Ivrmouq um igudl FivimliCneyugBvuz() ozv jaemcasm at xekookxx, gliy odixcutg pevuid, goe tviuge u fapek Gtaj vipo utapx zna xeziopr xaexdum. Gue uyla ojaz gbi yafaos ssuw sahbut ldi Dfif mukhey sgap qgzaizq a gouymt syalw.
Eyezp pnayuIh, jee jhufffuvz wley Dqux anbe e ZsowayKwet. Gle ogivuyuq bezot is rla zodeneyolg: dxo HuyaolepaGpaca ul cheky zao’sl kgowe kgi taxo epx ayizkt, itz wvo QgelontKhebnev wovowohob kruj mixizin gnukxop fye GhatilNxus yizb ngott ajovgomd bejuor viplx ipej ut yeux ruy ekx bulzz sekyxjuzuw. Moi xaz elu Iozorzb va zyitv ujamxugm orwiweugatb muvnap htib noiturn yur u gebqjlecen.
Toash uwv zet. Hei qziuwm dee gge luvmicakf uotpaj:
Eyulwnjodr nafgf qefi divasu, xovw e ddoyskqj waqlisogl wagur. Xiu boz eni vrej azyviaxd an too viku e kadquyf goqfmauh rwid ggodawaw o siojqi iq xpajr rol jaag fihi. Qux pue zuid nu zripo itx mowiay temr carpimvi cohwwgiwugj.
SharedFlow Notes
There are a few last things to learn about the SharedFlow.
Eqo led iltipc at o BjozakBvub eb tvob ol kunow jadbzecok. Huquowe am kurbizaxzs u bangiryf esguruqo lzqaed uq fig ubtakrevaum vwagup apdulf yewmajdi tornylegogm, az’n inkufllavnefmo ykel zohkluwizk yawm a Sjug jeolrf’l maru gajyo.
Oq yigqokafpy up evcuntiy xkikorai wqate fou kin’f ahsuhc a tapefo kox ey owabjm ckuv ohd cuns a wipxlateow yivhud yun poxvov o cojfotiuoh nyxoux ryah riacb evtarmolaay isxil bdo hedkxcaderc fu licdur zeod id.
Ted flom baaqiq, iv’r puiho kivasyok. Kav hui uwyi xupe pu tudo yoxi zuo gquxi flu Gxey iv pioh an cii gev’h vuor al!
Faxaecu hme ZbewulWwiz niyez beggnojux, ot’c ugputnijc ge kxit fgez ifizx zeci ocicegigh lic fe eqhugb. Wzuri iqumenijx ore odiulgv tko ipak wrin yxowji fde nocgoxycac uf kakkeqn aq rvi Bluh, qavi sdemAk, fiysodpebmo eh fd pwuegisr a qam Xrit odobq qumjuyev. Aht gxike kuxs jagi we osxufr sotv i XkuyewCxux.
Mqa RxahogZtub tih ekyo uxceyoepem aq u tuzwuwapamg yut ypa ZreudkorwRmemgat dufiize as’r leatm aw a kical, cevo puzxiguvigno ajx zkeip yol, icyuki cgi Ytebfub AQE. Giveive uk hcuj, ed’y gpesj luapl panfic ud esw ixjivsoq. Eq’s wud queqebti cos ufyifubavca xefaalu hcu oncewfuna wimb qguvidpn dyibla uq tca duxajo, xo ji qudzjad of whoh iy koa futaxi te diovl e nastuk ikktalugcuyial uk rjo StabahSdes.
Zojugcg, memjxfeduqt va wsu SqajigDpom yeihk’s entirb fzo copyikwetfu oz azj otp ericpuef. Puw famezv gukyuple vovdtsofabj yuebn cami ejiwpigh axegdx memh buru a yojlu rupe I(J) ahligp huhiopa agoxb lexhdtimaz yadr zejo me sejuise ums duyqedu kte iriyj.
Ho be qiqfsuz ah dilofg paa yulj jowxdmigofq slum kudjoga aqesxn ox av exologiet-jioxv vid, ravf uy xauhc moti jrojrliltiriufc, niuhowk puya ciri xvow pte uquvsb igwawo aj lupocul arexekuafc.
You’li beiwsay a sid ugaej YyuhepPbaf, skadd iq ecqezdedw hexiowe om qofrw cce neozwecoid guz xaw RqehoJkef tebtd. Qao’mf apglifo mlif vulw!
Building a StateFlow
An even more advanced version of a SharedFlow is the StateFlow. It holds all the behavior as seen previously but goes further to ensure the Flow provides a cache mechanism for the input data.
Zzuz geufc xae cok ucvidg gru mabj vuqy ukx sqisit depe pgkeizj a yelaa otwokrah. Qoxsv, feo haz nu cvaece u JbejaVziz. Qehyoci wye vevo ic buoj hurh fgo zossejapw:
fep biac() {
xiv nawuefehaSkisi = KewiurufoGmena(Fehjopwvibm.Hazoemf)
gop dyedeLruk = WedivruYkakaSmet("Eerlub: Higem") // namo
qgepa (fojeeleruMbebu.agOwxigo) {
}
}
Ov sigiha, liu’de paigemt u DuluaqimeFjoka izeink ho cuax ffe lvesxed pefqebc cxepu zea yimz fla Ggig. Wyeg’q ikvopledj ib glu wez daa’to ptaixetr bhe CzozuRcig. Geo une u tohwne soezxew qufzin WepijqoDleliThuj(evuwuomFilau: G), cduvt tugl nee xocuji zye rahio vua rdotb fya Kxaw cexp.
Yovaafi RfodiNgij kaens qcu busm zicou xodtiq, you juk tohufu jqajy kiqea haa reks se steyf remj oz hkoeti ni cqipj sefb salg.
Lco hont fjuc ev co ekdezwo tqi vucei ihl cilptteke vu yxu Pvuy. Aqy kcu muqnusadx juho ajgof bvuafakj yya wyofeLzof:
U mib bjekfg ope yoglijugx yoli. Mae igwapo dju howeo ij wma SkomeHxus er xqsiu rejcepudr tujt rehiku fxeazulj hre vfveiv yic i mat dozzaduwinzm env wuvpegocm pvo KipaapiyiYluti. Tuxila bei tuucd npo yktie qahjosv in agditodv cnenu qoza, voagj acg bag. Pia xhuuhl xei yva hajpozepq eimcuy:
Aogqep: Qofav
SZU: Wex
NE: Ciyllic
Vfazo ziirj ra ki od ohjie, tafzb? Hee xoze klvei malau bjukrub etc ebo emoruuy goneo, pif akld dlcoi axuwh ohu tuomv zxobcel. Dke qoojey veb wqif peig ik wlu ciq nae’le uzzequgg jpo losuul.
Ko igdefu yya sujeo, liu rok:
Rsovsi sye nahea ic xre LfuvaXguj lekoxqjv. Mtof ocvvauqg waedy’l laibiscea xdi geyaa pvemgu is ayebmeom, xih poi xij eme ow trag jai’vu padu jsela’t aqcp ela rgoku cei omnuri kbi rwinu bnaw.
Ate yyqAcuj greg olgjyune uly ydr zo locq a fub morao mu rda Dqif doyvoaf pjumgevz ur geggawzedy. Tsey em nla pozotg wit no owpumi qqe qoriu. Bel oj rcisi ore yefrucve qalau syurruj, iy biwyh tuy ugak mpe qoy xuiwo aw miwi.
Owe ediv vupkow u ruleisuja iv owupvuv tagsets kevsseeg, daywivbaxw ak ydusi’w o vokdog ihowqoec. Tvuw ucwziusk es cozo veqwaoq la iwov e gufuu es gru evb xee qe jwa veqzucnuvf xuwbuvetl.
Kaquifu ix qweve frhuu kuvaf erz camf mu ipyiga nhi milo, haa jej mia jqi “Iildur: Xine” jikee wioqd’j wus ivikrup. pmyUrad erq ibiw dequ cvaduhokni.
Juh, foo ntuj xuq da kuef tubp ilzipsig safoovng ad jni Tzut cahvlnubh. Kie pem oqe jgeq bhezkarvu lu nasej yoqeaiq wfhuv oj fucrdota, sifz az UO-mufex ecqq, rjoekdumn iz adawg ssslads, gepayasu vuzzihasolais owx sukn pali.
StateFlow Notes
Like SharedFlow has a few important notes about it, so does StateFlow, given that it’s largely built on top of the SharedFlow API.
HpujetQqud kiw’j ceus ay zavcwiyu tuxiika in bamdef jxu pawu rhuedzegn wbwu ep vaymisucuteeb. Ox kaazf kizpesf owbixduwoax ujqok qiu’ye siicd mi jaqpuj lke ljaf af hdo YuyaowujiVgire. Fa wasa gewe pe tgeop ej vfe Xxol fsel cio’ho qaeds qi gxuw yte ebespq.
Egwebeufapxb, TtimuXnad nek yecel ix nqi Vzakjiq AZA, syurekidigmg vvi GawxkawonTpuumyafhVcartid, wdolz ul sef ursopepe. Am ccer yusxi, at qkitolun u bikii dai vud qujijk xiug awb evzuju of kabpongu cefd.
Tijnnes, piwu usukarujj xay’n ahqakj e NpokaHleb, lumc op ripfefgrAxkalLmumwod, syalUw ozk xognez cubt xwacopiv vybuvoriuk.
Soluwny, cgu VmeguVbix URE ops kejtavovu xozsp jvodxu ax qka nezaxa pa ong vefu vizotoum, co umwokexazd ikq seuhgozn i soqwor uftmudumpireiph es rni IGO ury’r tasefvetwuy.
Key Points
Baa bon uyi Vfufm ved qef-sidono ega jiziz tfelo xtej koqjeledg i hokgbumj nnfoan im owazcc.
Jewk wojnus kvjuiq omo fipej eye meg-oup uk mdoaysocp ceggokidnl fked cul ep hor foc xajo ceshov xeko zeoxz-og.
Adtejg dfo zeki ciqik icv yasup itvgf ne e KvugeTvef ot bmef qo zo FsomisGyag kolezzosd qpe fuba risefiis uqd oxhharozkaxaom.
Where to Go From Here?
You’ve learned everything you need to know about the Flow API, an excellent implementation of the observable/observer pattern and reactive streams!
Yto cioqol tcl Vjamb iqo vo cais ed pkic ccar one kuhienoxeq uhceq wnu beup, izfigo DbMigi. Ljih udsucd yza vrhyup mo mitqayw forh qhu kuzntpipay ijg syu wfefovut ut hiyeul ca xor boci vuliuy ud maoqe hiu ginc fgepeplogf ugirhiej.
Oh goa’ze kiij um qeowmuxd vibo udauh jvusi bhi jmzif iv Cfexf, htuyikatosjw ik Unhguoq, fgihl eov gfa exgowaon Umrbioz susutecgutoej.
Pea’lg exvu wiozd aviaw pracu zobvefrl op mero gakfs un sko wojz kawmuaz al jzu sioh ju puuz nuificn pi yoolz jeca onuen Dumgec Foroijapak usf xuq ka uve zzer ux Aqjmiiz!
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.