Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Deep Dive into Kotlin Flow

Deep Dive into Kotlin Flow

My presentation at DroidKaigi 2025

https://2025.droidkaigi.jp/timetable/928111/

I had shared the Flow basis, 5 key perspective, 5 Flow operators and testing tips in this presentation. A recording will be available on the DroidKaigi website.

Avatar for Matsuda Jumpei

Matsuda Jumpei

September 12, 2025
Tweet

More Decks by Matsuda Jumpei

Other Decks in Programming

Transcript

  1. 2 Jumpei Matsuda @red_fat_daruma Senior Engineer at Drivemode, Inc. Android

    Apps on Automotive OS .F https://www.drivemode.com/ My preferences 👇 SDK Development Gradle Plugin Development Development Productivity Engineering
  2. 3

  3. 5

  4. 7

  5. 9 Cancellable? Completable? Always reachable? Single thread? Multi-threaded? Sequential? Concurrent?

    How does a thread to emit values effect? When a fi rst value comes?
  6. ,PUMJO'MPX w "EBUBTUSFBNQPXFSFECZDPSPVUJOFT w " fl PXDBOIBOEMFNVMUJQMFBTZODISPOPVTMZDPNQVUFEWBMVFT w 5SBOTGPSNBTZODISPOPVTMZDPNQVUFEWBMVFTJOUPBTUSFBN w

    1SPDFTTBTJOHMFWBMVFPOBEPXOTUSFBNUISPVHIBTVTQFOEJOH GVODUJPO w &YUFOTJCMFXJUIPQFSBUPST w 1PTTJCMFUPDSFBUFDVTUPN'MPXDMBTTFTGSPNAbstractFlow 12 'MPX#BTJDT
  7. 5IF'MPX5JOUFSGBDF w +VTUBDPOWFOUJPOCVUEPFTOUSFQSFTFOUBOZQSPQFSUZ w FHDPME IPU DPMMFDUBCMFSFQFBUFEMZFUD w %POUJOGFSCFIBWJPSGSPNTVQFS fi

    DJBMJOGPSNBUJPOMJLFUZQFT w "OZ'MPXDMBTTFTDBOCFEPXODBTUFEUPUIFFlowinterface 14 'MPX#BTJDT1FSTQFDUJWF5IF'MPX5JOUFSGBDF 
  8. #BDLQSFTTVSF w 7BMVFNJTTJPOTBSFOPUBMXBZTQSPDFTTFEJNNFEJBUFMZ w "OVQTUSFBNTCFIBWJPSNVTUCFEFUFSNJOFEJOTVDIBDBTF w 5IFSFBSFTFWFSBMTUSBUFHJFT w 3FOEF[WPVT $PO

    fl BUF w -JNJUFE6OMJNJUFECV ff FS w MutableSharedFlowIBTBTQFDJBMTUSBUFHZ 24 'MPX#BTJDT1FSTQFDUJWF#BDLQSFTTVSFBOE$PO fl BUJPO 
  9. 3FOEF[WPVTTUSBUFHZ w &NJUTBOFYUWBMVFUPBDPMMFDUPSEJSFDUMZPSXBJUTGPSJUUPCFSFBEZ w 5IJTJTBMTPBTLOPXOBTVOCV ff FSFE w 1SPT w

    "OFYUSBCV ff FSJTOPUSFRVJSFE w $POT w /PUTVJUBCMFGPSUJNFTFOTJUJWFWBMVFFNJTTJPO 25 'MPX#BTJDT1FSTQFDUJWF#V ff FSBOE$PO fl BUJPO 
  10. $POGMBUFTUSBUFHZ w %SPQPMEWBMVFTBOEFNJUPOMZUIFNPTUSFDFOUWBMVF w StateFlowCBTJDBMMZIBTUIJTCFIBWJPS w 1SPT w 5IJTDBONJUJHBUFBCVSTUWBMVFFNJTTJPO w

    $POT w "TMPXDPMMFDUPSNBZMPTUJOUFSNFEJBUFWBMVFT 26 'MPX#BTJDT1FSTQFDUJWF#V ff FSBOE$PO fl BUJPO 
  11. -JNJUFE#VGGFSTUSBUFHZ w 4UPSFWBMVFTJOBMJNJUFECV ff FSBOEQSPDFTTUIFNMBUFS w 1SPT w "DPMMFDUPSXPVMESFDFJWFWBMVFTBTNBOZBTQPTTJCMF w

    $POT w 5IFPWFS fl PXXJMMMPTUJOUFSNFEJBUFWBMVFTPSOFFEBMPOHTVTQFOTJPO w -BSHFSDBQBDJUZXPVMEJODSFBTFBNFNPSZDPOTVNQUJPO 27 'MPX#BTJDT1FSTQFDUJWF#V ff FSBOE$PO fl BUJPO 
  12. 6OMJNJUFE#VGGFSTUSBUFHZ w 4UPSFWBMVFTJOBJO fi OJUFCV ff FSBOEQSPDFTTUIFNMBUFS w 1SPT w

    "DPMMFDUPSDBOSFDFJWFBMMWBMVFT w $POT w 00.SJTL 28 'MPX#BTJDT1FSTQFDUJWF#V ff FSBOE$PO fl BUJPO 
  13. .VUBCMF4IBSFE'MPXTTUSBUFHZ w *UVTFTBDPOEJUJPOBMCBDLQSFTTVSFTUSBUFHZ w *GPGDPMMFDUPST  w -JNJUFE#V ff FSTUSBUFHZUIFDBQBDJUZJTSFQMBZ

    FYUSB#V ff FS$BQBDJUZ w 0UIFSXJTF  w *UIBTOPCV ff FSBOEEJTNJTTFTWBMVFFNJTTJPOT 29 'MPX#BTJDT1FSTQFDUJWF#V ff FSBOE$PO fl BUJPO 
  14. 'MPXCVJMEFSTBOEPQFSBUPST w 'MPX"1*TDPOTJTUPGCVJMEFSTBOEPQFSBUPST w #VJMEFST w 1SPEVDFBCZQVSQPTF fl PX w

    0QFSBUPST w 3FUVSOBOFXUSBOTGPSNFE fl PXPSUSBOTGPSNWBMVFT 31 'MPX#VJMEFST0QFSBUPST
  15. GMPX\^ w "DPME fl PXCVJMEFS w 4UBUFMFTTBOEOPTFSJBMJ[BUJPO w 4JNQMFBOEFBTZUPVTF w

    flowOfBOEWBSJBOUTVTFUIJTCVJMEFSJOUFSOBMMZ 32 'MPX#VJMEFST0QFSBUPST#VJMEFST 
  16. .VUBCMF4IBSFE'MPX w "IPU fl PXCVJMEFSUIBUTFSJBMJ[FTVQEBUFT w 4IBSFDBDIFTCFUXFFOEPXOTUSFBNT w "OFXDPMMFDUPSSFDFJWFTDBDIF fi

    STUJGSFQMBZ w $BDIFJTSFTFUBCMFFYUFSOBMMZ w 5IFCBDLQSFTTVSFTUSBUFHZJTDPOEJUJPOBMTPJUNBZCFUSJDLZ w 4USPOHMZSFDPNNFOEUPVTFsubscriptionCount 34 'MPX#VJMEFST0QFSBUPST#VJMEFST 
  17. .VUBCMF4UBUF'MPX w "IPU fl PXCVJMEFSUIBUTFSJBMJ[FTVQEBUFT w 'MPXBTB 4UBUF  w

    "MBTUWBMVFJTSFBEBCMFBOEXSJUBCMF w AtomicReferenceJTI"1*TBSFBWBJMBCMF w $PO fl BUFTWBMVFT w FH#VSTUVQEBUFTNBZFNJUPOMZUIFMBTUWBMVF 35 'MPX#VJMEFST0QFSBUPST#VJMEFST 
  18. 5FSNJOBMPQFSBUPST w "UFSNJOBMPQFSBUPSTUBSUDPMMFDUJOHB fl PX w FHcollect first fold toList

    stateIn shareIn FUD w .PTUPGPQFSBUPSTSFRVJSFDPNQMFUBCMF 37 'MPX#VJMEFST0QFSBUPST0QFSBUPST 
  19. 0QFSBUPS'VTJPOJO'MPX"1*EFTJHO w 7FSZMJNJUFECVJMUJOPQFSBUPSTDBOGVTFF ff FDUT w CoroutineContextDIBOHFTFHflowOn w #BDLQSFTTVSFDIBOHFTFHbuffer conflate

    w 5IFQPJOUJTXFDBOBWPJEVTJOHPMEDPOUFYUCBDLQSFTTVSF w 5IFQFSGPSNBODFDPVMECFCFUUFSUIP JUTOPUBNBJOQVSQPTF 39 'MPX#VJMEFST0QFSBUPST0QFSBUPS'VTJPO
  20. 4FMFDUB'MPXCVJMEFS w 4FMFDUBQSPQFS'MPXCVJMEFSGPSZPVSVTFDBTF w "6TFflow { ... } w #6TFchannelFlow

    { ... } w $$SFBUFBDVTUPNDMBTTFYUFOEJOHAbstractFlow 41 $VTUPNJ[BUJPO#VJMEFSDIPJDF
  21. 50 Create a ticker as a secondary source Collect values

    from an upstream through a Channel
  22. Wait the values from two sources simultaneously When a ticker

    fired, release and emit the last value When an upstream emitted, hold it
  23. TUBUF*OTIBSF*O w -BVODIBKPCJOBHJWFODPSPVUJOFTDPQF w "CBDLHSPVOEKPCDPMMFDUTBOEUSBOTGFSWBMVFTUPBOFX fl PX 52 Create a

    sharing job from *scope* Hold a sharing job to avoid GC $VTUPNJ[BUJPO(PPESFGFSFODFPQFSBUPST 
  24. )PX*UFTU'MPXDPEF w 5FTUBDVTUPNPQFSBUPS w 5FTUBDMBTTUIBUIBTB fl PX 56 5FTUJOH'MPX As

    for common debugging techniques of coroutines, please check out my session at DroidKaigi 2024 Debugging: All You Need to Know https://2024.droidkaigi.jp/timetable/694440/
  25. 0WFSSJEFCZNVMUJUISFBEFEEJTQBUDIFS w *OHFOFSBM TestCoroutineDispatcherJTVTFGVMUIPVHI w %VFUPDPODVSSFODZ SBDFDPOEJUJPOTBSFNPSFMJLFMZUPCFIJEEFO w "WJSUVBMDMPDLDBOCFBEKVTUFEJOGPSFHSPVOEDPEF w

    #BDLHSPVOEKPCTEPOUBMXBZTOFFEUPVTFUIJTNFDIBOJTN w *OTUFBE TimeSourceTIPVMECFJOKFDUBCMF w 6TFTestTimeSourceEVSJOHUFTUJOH 69 5FTUJOH'MPXUFTUJOHGPSBDMBTTVTJOH'MPX