๋ชฉ์ฐจ
Flow ์ดํดํ๊ธฐ
์คํธ๋ฆผ์ ์ ๋ ฅ์ฅ์น๋ ์๋ฒ๋ก๋ถํฐ ๋ค์ด์ค๋ ์ ๋ ฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์ฝ์ด๋ค์ด๋ฉด์ ์ถ๋ ฅ ์ฅ์น๋ ๋์์ ํ๋ ์ด์ด๋ก ๋ฐ์ดํฐ ํ๋ฆ์ ๋ด๋ณด๋ด๋ ์ญํ ์ ํ๋ ๊ฐ์ฒด์ด๋ค.
์ฝํ๋ฆฐ์ ํ๋ก์ฐ๋ ๋จ์ผ ๊ฐ๋ง ๋ฐํํ๋ suspend ํจ์์ ๋ฌ๋ฆฌ ์ฌ๋ฌ ๊ฐ์ ์์ฐจ์ ์ผ๋ก ๋ด๋ณด๋ผ ์ ์๋ ์ ํ์ด๋ค.
์๋ฅผ ๋ค์ด Flow๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์ ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์์ ํ ์ ์๋ค.
Flow๋ ์ฝ๋ฃจํด์ ๊ธฐ๋ฐ์ผ๋ก ๋น๋๋์ด ๋น๋๊ธฐ์ ์ผ๋ก ๊ณ์ฐํ ์ ์๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ฐ๋ ์ด๋ค. ์ด ๋ ๋ด๋ณด๋ด๋ ๊ฐ์ ๋์ผํ ์ ํ์ด์ด์ผํ๋ค. Flow<Int> ์ ๊ฒฝ์ฐ ์ ์ ๊ฐ์ ๋ด๋ณด๋ด๋ ํ๋ฆ์ ๋งํ๋ค.
[kotlin flows in practice ๋ด์ฉ ์ ๋ฆฌ]
์ด ๋์๋ ๊ทธ๋์ ํธ์๊น์ง ๊ฐ๋ ์๊ฐ์ ๋ญ๋นํ๊ณ ๋ค๋ฅธ ๊ณณ์์ ๋ฌผ์ ์ฐพ์์ผํ๋ค.
์ด๋ฌํ ์คํจ๋ฅผ ์ฌ๋ฌ ๋ฒ ๊ฒช์ ํ ์ผ์ข ์ ์ธํ๋ผ๋ฅผ ๋ง๋๋ ๊ฒ ๋ซ๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๋์ ๋ค์์ ํธ์๋ก ๊ฑธ์ด๊ฐ ๋ ํ์ดํ๋ฅผ ์ค์นํ๋ค.
์ด์ ๋ฌผ์ด ํ์ํ ๋ ํธ์๊ฐ ๋ง๋ฅด์ง ์์๋ค๋ฉด ๊ผญ์ง๋ฅผ ์ด๊ธฐ๋ง ํ๋ฉด ๋ฌผ์ด ๋์จ๋ค.
์ด๋ ๊ฒ ํ์ดํ๋ฅผ ์ค์นํ๋ฉด ,์ฌ๋ฌ ์์ค์ ๋ฐ์ดํฐ์ธ ์ฆ ๋ฌผ์ค๊ธฐ๋ฅผ ํฉ์น ์ ์๋ค.
์ด์ ํ์ตธ๋ ํธ์๊ฐ ๋ง๋๋์ง ํ์ธํ ํ์๊ฐ ์๋ค.
์๋๋ก์ด๋ ์ฑ์์๋ ๊ฐ๋จํ ๊ฒฝ๋ก๋ฅผ ํตํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋ทฐ๊ฐ ์์๋๋ฉด ViewModel์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ViewModel์ด data layer์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ค. suspend ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๊ณผ์ ์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
ํ์ง๋ง ํ๋์ ๊ทธ๋ ๊ฒ ํ๋ฉด ํ์ตธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธํ๋ผ์ ํฌ์ํ๋ ๊ฒ ๋ซ๋ค๋ ๊ฑธ ๊นจ๋ซ๊ฒ ๋๋ค.
๊ด์ ์ค์นํ๊ณ ๋๋ฉด ๋ฐ์ดํฐ ์์ค ์ ๋ฐ์ดํธ๊ฐ ์๋์ผ๋ก ๋ทฐ์๊น์ง ์ ๋ฌ๋๋ค. ๋์ด์ ํธ์๋ก ๊ฑธ์ด๊ฐ ํ์๊ฐ ์๋ค.
์ด๋ฐ ํจํด์ ์ฌ์ฉํ๋ ์์คํ ์ Reactive : ๋ฐ์ํ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๊ด์ฐฐํ๋ ์ชฝ์ด ๊ด์ฐฐ ๋์์ ๋ณํ์ ์๋์ผ๋ก ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ ํ ๋ฐฉํฅ์ผ๋ก ํ๋ฅด๊ฒ ํ๋ ๊ฒ์ด ์ข๋ค. ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ๋ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ผ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ ์๊ฒฉ ๋ฐ์ดํฐ ์์ค์ ๊ฐ ํญ๋ชฉ์ ๋ก๋ํ๋ผ๊ณ ์ง์ํ๋ค.
์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ๋ทฐ์์ ๋ก๋ฉ ์ค์ธ ์คํผ๋๋ฅผ ํ์ํ๊ฒ ๋๋ค.
์ฆ, ์๋๋ ๊ฑด ์๋์ง๋ง ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ธฐ ์ด ๋ฐฉ๋ฒ์ด๋ค.
๋ ์ข์ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฐฉํฅ์ผ๋ก ํ๋ฅด๊ฒ ํ๊ณ ์๋๊ด ์ญํ ์ ํ๋ ์ธํ๋ผ๋ฅผ ๊ตฌํํด์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ฒฐํฉํ๊ณ ๋ณํํ๋ ๊ฒ์ด ์ข๋ค.
๋ฌด์ธ๊ฐ ๋ฐ๋์ด์ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์ํ๋ฉด ๊ด์ ๋ค์ ์ค์นํ ์ ์๋ค.
์ด๋ฐ ๊ฒฐํฉ๊ณผ ๋ณํ์ ์คํํ๋ ค๋ฉด ๋๊ตฌ๊ฐ ํ์ํ๋ค !
์ด๋ฅผ ์ํด์ ์ค๋ ์ธ์ ์์๋ Kotlin Flow๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
Kotlin Flow<T>
Flow๋ ๋ฌผ์ด ์๋๋ฏ๋ก ์ด๋ค ์ ํ์ด๋ ๊ฐ๋ฅํ๋ค.
์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ UI ์ํ๋ ๋ ์ ์๋ค.
์ฉ์ด ์ ์
์์ฐ์๋ ๋ฐ์ดํฐ๋ฅผ Flow์ ์ ๋ ฅํ๊ณ ์๋น์๋ Flow์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ค.
android์์๋ ๋ฐ์ดํฐ ์์ค๋ ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ์ ํ์ ์ธ ์ฑ ๋ฐ์ดํฐ ์์ฐ์์ด๋ค.
์ต์ข ์ ์ผ๋ก ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ui๊ฐ ์๋น์ ์ญํ ์ ํ๋ค.
Creating Flows : Flow๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ
๋จผ์ ํธ์๋ก ๊ฑธ์ด๊ฐ์ผํ๋ค .๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ๋ก ์ง์ ๋ง๋ค ํ์์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๋ฃจํด์ Flow๊ฐ ์ด๋ฏธ ๊ฒฐํฉ๋์ด ์๋ค.
๊ฐ๋ฐ์๋ ๋ฐ์ดํฐ ์์ฑ๋ฐฉ๋ฒ์ ๋ชฐ๋ผ๋ ํ์ดํ์ ์ฐ๊ฒฐํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
Room์ ์๋ก ๋ค์ด๋ณด์
List<Codelab> ํ์ ์ Flow๋ฅผ ๋ ธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฆฐ๋ค. Room ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฐ์ ์ญํ ์ ๋งก์์
์ ๋ฐ์ดํธ๊ฐ ์์ ๋๋ง๋ค ์ฟผ๋ฆฌ ๋ด์ฉ์ ์ ์กํ๋ค.
ํ๋ก๋ฅผ ์ง์ ๋ง๋ค์ด์ผํ ๋ ์ต์
- ํ๋ก ๋น๋
userMessageDatatSource์์ ์์๋ก ์ฑ์์ ์จ ๋ฉ์์ง๋ฅผ ํ์ธํ๋ ค๊ณ ํ๋ค๊ณ ์๊ฐํด๋ณด์.
๋ฉ์์ง ๋ชฉ๋ก ์ ํ์ ํ๋ก๋ก ์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ๋ ธ์ถํ ์ ์๋ค. ์ด ๋ flow๋ฅผ ๋ง๋๋ ค๋ฉด flow ๋น๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค. flow๋ ์ฝ๋ฃจ์น ์ปจํ ์คํธ์์ ์คํ๋๊ธฐ ๋๋ฌธ์ flow ๋น๋๋ suspend ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค.
๋ด๋ถ์์ while(true) ๋ฃจํ๋ก ๋ฐ๋ณตํ๊ฒ ํ๊ณ , ๋จผ์ messageApi๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ์จ๋ค.
๊ฐ์ ธ์จ ๋ฉ์์ง๋ฅผ emit ํจ์๋ฅผ ํตํด ๋ ธ์ถ์ํจ๋ค. ์ด๋ฅผ ํตํด ์ปฌ๋ ํฐ๊ฐ ์์ดํ ์ ๋ฐ์ ๋๊น์ง ์ฝ๋ฃจํด์ ์ค๋จ์ํฌ ์ ์๋ค.
๋ง์ง๋ง์ผ๋ก ์ผ์ ์๊ฐ ์ฝ๋ฃจํด์ ์ค๋จํ๋ค.
์ flow๋ ๋์ผํ ์ฝ๋ฃจํด์์ ์ฐ์ฐ์ ์์ฐจ์ ์ผ๋ก ์งํํ๋ฉฐ ๊ด์ฐฐ์๊ฐ ์ฌ๋ผ์ง๊ณ ์์ดํ ์์ง์ด ์ค๋จ๋๋ฉด ๋ฉ์ถ๊ฒ ๋๋ค.
flow ๋น๋์ ์ ๋ฌ๋ suspend ๋ธ๋ก์ ์์ฐ์ ๋ธ๋ก์ด๋ผ๊ณ ๋ ํ๋ค.
Collecting Flows
Android์์ ์์ฐ์์ ์๋น์ ๊ฐ์ ๊ณ์ธต์ ๊ทธ ์ดํ์ ๊ณ์ธต ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์์ ํ ์ ์๋ค.
ํ๋ก๋ฅผ ๋ณํํ๋ ค๋ฉด ์ค๊ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
latestMessage ์คํธ๋ฆผ์ด ํ๋ก์ ์์์ ์ด๋ผ๊ณ ํ๋ฉด map ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ ์์ค์์ ๋ฐ์ ์๋ณธ ๋ฉ์์ง๋ฅผ ๋ค๋ฅธ ํ์ (์ฌ๊ธฐ์๋ MessageUiModel)์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
๊ฐ ์ฐ์ฐ์๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ์ ํ๋ก๋ฅผ ์์ฑํ๋ค.
์คํธ๋ฆผ์ ํํฐ๋งํ์ฌ ์ค์ํ ์๋ฆผ์ด ํฌํจ๋ ํด๋น ๋ฉ์์ง๋ฅผ flow๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด ์คํธ๋ฆผ์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น?
catch ์ฐ์ฐ์๋ ์ ์คํธ๋ฆผ flow์์ ํญ๋ชฉ์ ์ฒ๋ฆฌํ๋๋์ ๋ฐ์ํ ๋งํ ์๋ฌ๋ฅผ ์ฐพ๋๋ค.
upstram flow๋ ํ๋ก๋์ ๋ธ๋ก์์ ์์ฑํ flow์ด๊ณ ํ์ฌ ์ฐ์ฐ์ ์ ์ ์ด ๋ธ๋ก์ ํธ์ถํ๋ค.
ํ์ฌ ์ฐ์ฐ์ ์ดํ์์ ๋ฐ์ํ๋ ๋ชจ๋ ๊ฒ์ downstream flow๋ผ๊ณ ํ๋ค.
Collecting Flows
์ผ๋ฐ์ ์ผ๋ก flow ์์ง์ UI ๊ณ์ธต์์ ์ผ์ด๋๋ค. ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ์์น์ด๊ธฐ ๋๋ฌธ์ด๋ค
์ฐ๋ฆฌ ์์์์๋ ๋ชฉ๋ก์ ์ต์ ๋ฉ์์ง๋ฅผ ํ์ํ ๊ฒ์ด๋ค. ๊ทธ๋์ผ ํ์ตธ๊ฐ ํ์ฌ ์ํฉ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
terminal ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์์ ํ๊ธฐ ์์ํด์ผํ๋ค.
์คํธ๋ฆผ์ ๋ชจ๋ ๊ฐ์ ์ ์ก ์ฆ์ ๊ฐ์ ธ์ค๋ ค๋ฉด collect๋ฅผ ์ฌ์ฉํ๋ค.
collect๋ ์๋ก์ด ๊ฐ์ด ์๊ธธ ๋๋ง๋ค ํธ์ถ๋๋ ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค.
์ด๊ฑด suspend ํจ์์ด๋ฏ๋ก ์ฝ๋ฃจํด ๋ด์์ ์คํ๋์ด์ผํ๋ค.
terminal ํจ์๋ฅผ flow์ ์ ์ฉํ๋ฉด ํ์์ ๋ฐ๋ผ flow๊ฐ ์์ฑ๋๊ณ ๊ฐ์ ์ ์กํ๊ธฐ ์์ํ๋ค.
๋ฐ๋ฉด, intermediate ์ฐ์ฐ์๋ ์ผ๋ จ์ ์ฐ์ฐ์๋ง ์ค์ ํ๋ฉฐ ํญ๋ชฉ์ flow๋ก ์ ์กํ์ ๋ ๊ฐ๊ฒฉ์ ๋๊ณ ์ฐ์ฐ์๋ฅผ ์คํํ๋ค.
userMessage์์ collect๋ฅผ ํธ์ถํ ๋๋ง๋ค ์ flow๊ฐ ์์ฑ๋๋ค.
์์ฐ์ ๋ธ๋ก์ ์ ํด์ง ๊ฐ๊ฒฉ์ ๋ฐ๋ผ api์์ ๋ฉ์์ง๋ฅผ ์๋ก๊ณ ์นจํ๊ธฐ ์์ํ๋ค.
์ฝ๋ฃจํด ์ฉ์ด์์ ์ด๋ฐ ํ๋ก๋ฅผ clod flow๋ผ๊ณ ํ๋ค.
ํ์์ ๋ฐ๋ผ ์์ฑ๋๊ณ ๊ด์ฐฐ๋๋ ์ค์๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ๋๋ฌธ์ด๋ค
Flows in Android UI
Android UI์์ ์ต์ ์ผ๋ก flow๋ฅผ ์์งํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์. ๊ณ ๋ คํด์ผํ ์ ์ ๋๊ฐ์ง๊ฐ ์๋ค.
์ฒซ ๋ฒ์งธ๋ ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ์์ ๋ ๋ฆฌ์์ค๋ฅผ ๋ญ๋นํ์ง ์์์ผํ๋ค.
๋ ๋ฒ์งธ๋ ๊ตฌ์ฑ ๋ณ๊ฒฝ๊ณผ ๊ด๋ จ์ด ์๋ค.
MessagesActivity์์ ํ๋ฉด์ ๋ฉ์์ง ๋ชฉ๋ก์ ํ์ํ๋ ค ํ๋ค๊ณ ์๊ฐํด๋ณด์.
์ผ๋ง๋ ์ค๋ flow์์ collecting์ ํด์ผํ ๊น?
UI๊ฐ ์ ์ ํ ๋์ํ๊ณ , ํ๋ฉด์ UI๊ฐ ํ์๋์ง ์์ ๋๋ flow์์ ์์ง์ ์ค๋จํด์ผํ๋ค.
๋ฌผ๋ก ๋น์ ๋ฅผ ๋ค์ด๋ณด๋ฉด, ํ์ตธ๊ฐ ์ด๋ฅผ ๋ฆ๊ฑฐ๋ ๋ฎ์ ์ ์ ๋๋ ์๋๊ผญ์ง๋ฅผ ์ ๊ฐ์ผํ๋ค. ํ์ตธ๋ ๋ฌผ์ ๋ญ๋นํ๋ฉด ์๋๋ค.
UI๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ฉด์ ์ ๋ณด๋ฅผ ํ์ํ์ง ์์ ๋๋ flow์์ ์์งํด์๋ ์๋๋ค.
์ฌ๊ธฐ์๋ ์ฌ๋ฌ ์ต์ ์ด ์๋๋ฐ ๋ชจ๋ ์ต์ ์ด UI ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ธ์ํ๋ค. ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฃจํด๋ณ api๋ LiveData๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
asLiveData flow ์ฐ์ฐ์๋ flow๋ฅผ LiveData๋ก ๋ณํํด์ UI๊ฐ ํ๋ฉด์ ํ์๋๋ ๋์์๋ง ํญ๋ชฉ์ ๊ด์ฐฐํ๋ค.
๋ทฐ ๋ชจ๋ธ ํด๋์ค์์๋ ์ด๋ฐ ๋ณํ์ด ๊ฐ๋ฅํ๋ค.
ui์์๋ ํ์์ฒ๋ผ LiveData๋ฅผ ์๋นํ๋ค.
UI ๊ณ์ธต์์ flow๋ฅผ ์์งํ ๋ repeatOnLifeCycle์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์ด๋ Lifecycle.State๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ suspend ํจ์์ด๋ค.
์ด api๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ธ์ํ๋ฉฐ ์๋ช ์ฃผ๊ธฐ๊ฐ ํด๋น ์ํ์ ๋๋ฌํ๋ฉด ๋ธ๋ก์ ์ ๋ฌํ ์ ์ฝ๋ฃจํด์ด ์๋์ผ๋ก ์์๋๋ค.
๊ทธ๋ฌ๋ฉด ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ทธ ์ํ ์๋๋ก ๋จ์ด์ง๋ฉด ์งํ ์ค์ธ ์ฝ๋ฃจํด์ด ์ทจ์๋๋ค. ๋ธ๋ก ์์ชฝ์ ์ฝ๋ฃจํด ์ปจํ ์คํธ์ด๋ฏ๋ก collect๋ฅผ ํธ์ถํ ์ ์๋ค.
repeatOnLifecycle์ suspend ํจ์์ด๋ฏ๋ก ์ฝ๋ฃจํด์์ ํธ์ถํด์ผํ๋ค.
์กํฐ๋นํฐ ์์ ์์ผ๋ฏ๋ก lifecycleScope๋ก ์์ํ ์ ์๋ค.
์๋ช ์ฃผ๊ธฐ๊ฐ ์ด๊ธฐํ๋๋ฉด ์ด ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์ข๋ค. ์๋ฅผ ๋ค์ด ์ด ์กํฐ๋นํฐ๋ onCreate์์ ํธ์ถํ๋ค.
repeatOnLifeCycle์ ์๋ํ ๋์์ UI ์๋ช ์ฃผ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ณ ๋ คํ๋ค.
ํนํ repeatOnLifeCycle์ ํธ์ถํ๋ ์ฝ๋ฃจํด์ ์๋ช ์ฃผ๊ธฐ๊ฐ ํ๊ดด๋ ๋๊น์ง ์คํ์ ๋ค์ ์์ํ์ง ์๋๋ค.
์ฌ๋ฌ flow์์ ์์งํด์ผํ ๊ฒฝ์ฐ repeatOnLifecycle์์ launch๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ฝ๋ฃจํด์ ์์ฑํด์ผํ๋ค.
flowWithLifeCycle์ฐ์ฐ์๋ ์์งํ ํ๋ก๊ฐ ํ๋๋ฟ์ผ ๋ repeatOnLifecycle ๋์ ์ฌ์ฉํ ์ ์๋ค.
์ด api๋ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋์ ์ํ์์ ๋ค์ด๊ฐ๊ณ ๋๊ฐ ๋ ํญ๋ชฉ์ ์ ์กํ๊ณ ๊ธฐ๋ณธ ์์ฐ์๋ฅผ ์ทจ์ํ๋ค.
์กํฐ๋นํฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์์ฑ ์์ ๋ถํฐ ์์๋ณด์. ์ฌ์ฉ์๊ฐ ํ๋ฒํผ์ ์ ๋ฌํ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ ์ก๋๊ณ ์กํฐ๋นํฐ์์ onStop ์ ํธ๋ฅผ ๋ฐ๊ณ , onStart๊ฐ ํธ์ถ๋์์ ๋ ์ฑ์ ๋ค์ ์ฐ๋ค.
repeatOnLifecycle์ ํธ์ถํ๋ฉด UI๊ฐ ํ๋ฉด์ ํ์๋๋ ๋์ flow ์ ์ก์ ์ฒ๋ฆฌํ๊ณ ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ด๋ํ๋ฉด ์์ง์ด ์ทจ์๋๋ค.
์๋๋ก์ด๋ UI์์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก flow๋ฅผ ์์งํ ์๋ ์๋ค.
lifecycleScope์์ ์์ํ ์ฝ๋ฃจํด์์ ๋ฐ๋ก ์์งํ ์๋ ์๋ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด๋ ๋์ง๋ง ์ด๋ฐ ๋ฐฉ์์ ์์ง๋ธกใด ์ํํ๋ค.
flow์์ ์์งํ๊ณ UI ์์๋ฅผ ์ ๋ฐ์ดํธํ๋ค. ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ์์ด๋ ๋ง์ฐฌ๊ฐ์ง
ํ๋ฉด์ ui๊ฐ ํ์๋์ง ์์ ๋๋ ์ฐ๋ฆฌ๋ ํ๋ก์์ ์์งํ๋ฉด ์๋๋ค.
lifecycleScope.launch์์ ์ง์ ์์งํ๋ ๊ฒฝ์ฐ ์กํฐ๋นํฐ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์์ ๋ ๊ณ์ ํ๋ก ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ๋๋ค. ์ด๋ ๋ญ๋น์ด๊ณ ์ํํ๋ค.
์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ผ ๋ ๋ํ์์๋ฅผ ํ์ํ๋ฉด ์ถฉ๋์ด ์ผ์ด๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด onStart์์ ์๋์ผ๋ก ์์ง์ ์์ํ๊ณ onStop์์ ์์ง์ ์ค๋จํด์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ repeatOnLifecycle์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์์ฉ๊ตฌ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๋ค.
launchWhenStarted๋ฅผ ์ฌ์ฉํ๋ฉด lifecycleScope.launch๋ณด๋ค ๋ซ๋ค.
์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ์์ ๋ flow ์์ง์ ์ค๋จํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฐฉ๋ฒ์ flow ์์ ์๋ฅผ ๊ณ์ ํ์ฑํ์์ผ์ ํ๋ฉด์ ํ์๋์ง ์์ ํญ๋ชฉ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฑ์ธ ์ ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํญ๋ชฉ์ ์ ๋ฌํ ์๋ ์๋ค.
UI์์ ํ๋ก ์์ฐ์์ ๊ตฌํ ๋ฐฉ๋ฒ์ ์ ์ ์์ผ๋ฏ๋ก repeatOnLifecycle์ด๋ flowWithLifecycle์ ์์ ํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. UI๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์์ ๋ ํญ๋ชฉ์ ์์งํ๊ธฐ ์๊ณ ํ๋ก ์์ฐ์๋ฅผ ์ด๋ ค๋๋ค.
์ด๋ ๊ฒ ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ์์ ๋ ํ๋ก ์์ง์ ์ต์ ํํ ๊ฒฝ์ฐ ์ฑ์์ ๊ตฌ์ฑ ๋ณ๊ฒฝํ ๋์ ๋ช ๊ฐ์ง ์๋ น์ ์์๋ณด์
ํ๋ก๋ฅผ ๋ทฐ์ ๋ ธ์ถํ๋ฉด ์๋ช ์ฃผ๊ธฐ๊ฐ ์๋ก ๋ค๋ฅธ ๋ ์์ ์ฌ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผํ๋ค๋ ๊ฑธ ๊ณ ๋ คํด์ผํ๋ค. ๋ชจ๋ ์๋ช ์ฃผ๊ธฐ๊ฐ ํด๋นํ๋ ๊ฑด ์๋๋ค. ์กํฐ๋นํฐ์ ํ๋๊ทธ๋จผํธ์ ์๋ช ์ฃผ๊ธฐ๋ ๊น๋ค๋ก์ธ ์ ์๋ค.
๊ธฐ๊ธฐ๊ฐ ํ์ ๋์๊ฑฐ๋ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ์์ ํ๋ฉด ๋ชจ๋ ์กํฐ๋นํฐ๋ฅผ ๋ค์ ์์ํ์ง๋ง ViewModel์ ๊ทธ๋ ์ง ์๋ค.
์ฆ, viewModel์์ ๋ชจ๋ ํ๋ก๋ฅผ ๋ ธ์ถํ๋ ๊ฑด ์๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ฐ ์ฝ๋ ํ๋ก๊ฐ ์๋ค.
์ฝ๋ ํ๋ก๋ ์ฒ์์ผ๋ก ์์ง๋ ๋๋ง๋ค ๋ค์ ์์ํ๊ธฐ ๋๋ฌธ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ ํ๋ฒ ํ์ ํ ๋ค์ ๋ ธ์ถ๋๋ค.
๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ๋ญ์ง ?
์ฐ๋ฆฌ์๊ฒ๋ ๋ฒํผ๊ฐ ํ์ํ๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ์๋ค๊ฐ ์ฌ๋ฌ ์ปฌ๋ ํฐ ์ฌ์ด์ ๊ณต์ ํ๋ฉด ๋๋ค. ์ฌ์์ฑ ํ์๋ ๊ด๊ณ์๋ค.
์ด๋ฐ ๋ชฉ์ ์ผ๋ก StateFlow๊ฐ ์์ฑ๋์๋ค.
StateFlow๋ ๋ฌผ๋ก ๋น์ ํ๋ฉด ๋ฌผํฑํฌ์ด๋ค. ์ปฌ๋ ํฐ๊ฐ ์๋๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ค. ์ผํ์ฑ ์์ง์ด ์๋ ์ ์์ผ๋ฏ๋ก ์กํฐ๋นํฐ๋ ํ๋๊ทธ๋จผํธ์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ ์์ ํ๋ค.
StateFlow์ ์ฌ๋ฌ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ํ์ํ ๋๋ง๋ค ๊ฐ์ ์ ๋ฐ์ดํธํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ด ์ฝ๋ฃจํด์์ ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ๋ฐ์ํ์ด๋ผ๊ณ ํ๊ธฐ๋ ์ด๋ ต๋ค.
ํ์ตธ๋ ๊ฒ์์ ๊ฐ์ ํ๋ผ๊ณ ๋งํ์ ๊ฒ์ด๋ค. ๋์ ํ๋ก๋ฅผ StateFlow๋ก ๋ณํํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด StateFlow๊ฐ ์ ์คํธ๋ฆผ ํ๋ก์์ ๋ชจ๋ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ต์ ๊ฐ์ ์ ์ฅํ๋ค. ์ปฌ๋ ํฐ๊ฐ ์๊ฑฐ๋ ๋ง์ ์ ์์ผ๋ฏ๋ก ๋ทฐ๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ์ ์ข๋ค.
์ฌ๋ฌ ์ ํ์ flow๊ฐ ์์ง๋ง StateFlow๋ฅผ ๋งค์ฐ ์ ํํ๊ฒ ์ต์ ํํ ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ๊ถ์ฅํ๋ค.
ํ๋ก๋ฅผ StateFlow๋ก ๋ณํํ ๋ stateIn ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ธ ๊ฐ์ง ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋๋ฐ,initalValue๋ StateFlow์ ํญ์ ๊ฐ์ด ์์ด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฝ๋ฃจํด ๋ฒ์๋ ๊ณต์ ๊ฐ ์์๋๋ ์์ ์ ์ ์ดํ๋๋ฐ ์ฌ๊ธฐ์ ๋ทฐ๋ชจ๋ธ์ ๋ฒ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ง์ง๋ง์ผ๋ก started ๋งค๊ฐ๋ณ์์ ๋ํด ์์๋ณด๊ธฐ ์ํด 2๊ฐ์ง ์๋๋ฆฌ์ค๋ฅผ ๋ณด์
์ฒซ์งธ, ํ๋ก์ ์ปฌ๋ ํฐ์ธ ์กํฐ๋นํฐ๊ฐ ์ผ์ ์๊ฐ ํ๊ดด๋์๋ค๊ฐ ๋ค์ ์์ฑ์ํค๋ ํ์ ์ด๋ค.
๋์จฐ, ํ์ผ๋ก ์ด๋ํด์ ์ฑ์ ๋ฐฑ๊ทธ๋ผ์ด๋์ ๋ฃ๋๋ค.
ํ์ ์๋๋ฆฌ์ค์์๋ ์ต๋ํ ๋น ๋ฅด๊ฒ ์ ํํ๋ ค๋ฉด Flow๋ฅผ ๋ค์ ์์ํด์๋ ์๋๋ค.
๊ทธ๋ฌ๋ ํ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ ๋ฐฐํฐ๋ฆฌ์ ๋ค๋ฅธ ๋ฆฌ์์ค๋ฅผ ์๋ผ๊ธฐ ์ํด ๋ชจ๋ ํ๋ก๋ฅผ ์ค๋จํด์ผํ๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ค ์๋๋ฆฌ์ค์ธ์ง ํ์งํ ์ ์๋? ์๊ฐ ์ด๊ณผ๋ฅผ ์ฌ์ฉํ๋ค.
StateFlow์ ์์ง์ด ์ค๋จ๋์์ ๋ ๋ชจ๋ ์ ์คํธ๋ฆผ ํ๋ก๋ฅผ ์ฆ์ ์ค๋จํ๋ ๊ฑด ์๋๋ค. ์คํ๋ ค ์ฝ 5์ด์ ๋๋ฅผ ์ ์ ๊ธฐ๋ค๋ฆฐ๋ค.
์๊ฐ ์ด๊ณผ์ ์ ํ๋ก๋ฅผ ์์งํ๋ฉด ์ ์คํธ๋ฆผ ํ๋ก๊ฐ ์ทจ์๋์ง ์๋๋ค.
WhileSubscribed(5000)์ด ๋ฐ๋ก ๊ทธ๋ฐ ์ผ์ ํ๋ค.
์ด ํ์๋ ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๊ฐ์ ๋ ๋ฐ์์ด ๋์์๋ค. ํ ๋ฒํผ์ ๋๋ฅด๊ธฐ ์ ์ ๋ทฐ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์์ ํ๊ณ StateFlow๋ ์ ์์ ์ผ๋ก ์ ์คํธ๋ฆผ ํ๋ก๋ฅผ ์์ฑํ๋ค. ์ด์ ๋ทฐ๊ฐ ์ค๋จ๋๋ฉด ์ปฌ๋ ์ ์ด ์ฆ์ ์ข ๋ฃ๋๋ค.
๊ทธ๋ฌ๋ StateFlow๋ ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ผ๋ก ์ธํด ์ ์คํธ๋ฆผ ํ๋ก๋ฅผ ์ค๋จํ๋๋ฐ 5์ด๊ฐ ๊ฑธ๋ฆฐ๋ค. ์ ํ ์๊ฐ์ด ์ง๋ฌ๊ณ ์ ์คํธ๋ฆผ ํ๋ก๋ ์ทจ์๋๋ค.
์ฌ์ฉ์๊ฐ ์ฑ์ ๋ค์ ์ด ๊ฒฝ์ฐ ์๋์ผ๋ก ์ ์คํธ๋ฆผ ํ๋ก๊ฐ ๋ค์ ์์๋๋ค.
๊ทธ๋ฌ๋ ํ์ ์๋๋ฆฌ์ค์์ ๋ทฐ๋ ์ ์๋ง ์ค๋จ๋๋ค. ์ด์จ๋ 5์ด์ด๋ด์ด๋ค.
๋ฐ๋ผ์ StateFlow๋ ์ ๋ ๋ณต์ํ์ง ์๊ณ ๋ชจ๋ ์ ์คํธ๋ฆผ ํ๋ก๋ฅผ ํ์ฑ์ํ๋ก ์ ์งํ๋ฉฐ ์๋ฌด์ผ๋ ์์๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉ์์๊ฒ ํ์ ์ธ์คํด์ค๋ฅผ ๋ณด๋ธ๋ค.
์ฆ ๋ค์ ๋งํด StateFlow๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐ๋ชจ๋ธ์์ ํ๋ก๋ฅผ ๋ ธ์ถํ๊ฑฐ๋ asLiveData๋ฅผ ์ฌ์ฉํด์ ์ด์ ๋์ผํ ์์ ์ ์คํํ๋ ๊ฒ ์ข๋ค.
Testing Flows
๋ ๊ฐ์ง ์๋๋ฆฌ์ค๊ฐ ์๋ค.
์ฒซ ๋ฒ์งธ๋ ํ ์คํธ ๋์์ด ๋ฌด์์ด๋ UUT๊ฐ ํ๋ก๋ฅผ ๋ฐ๋๋ค. ์ข ์์ฑ์ ๊ฐ์ ์์ฐ์๋ก ๊ต์ฒดํ์ฌ ํ ์คํธํ๋ ๊ฒ ํธ๋ฆฌํ๋ค.
์๋ฅผ ๋ค์ด ์ด ๊ฐ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ํ๋ก๊ทธ๋๋ฐํ์ฌ ๊ฐ ํ ์คํธ ์ฌ๋ก์ ํ์ํ ๊ฑธ ์ ์กํ ์ ์๋ค.
๊ฐ๋จํ ์ฝ๋ ํ๋ก์ ์๋ฅผ ๋ค์ด๋ณด์. ํ ์คํธ ์์ฒด๋ ํ ์คํธ ์๋ ์ฃผ์ ์ ๊ฒฐ๊ณผ์ ๋ํ ์ด์ค์ ์ ๋ง๋ ๋ค. ์ด๋ ํ๋ก๋ ๋ค๋ฅธ ๊ฒ ๋ ์ ์๋ค.
๋๋ฒ์งธ๋ UUT๊ฐ ํ๋ก๋ฅผ ๋ ธ์ถํ๊ณ ์ด ๊ฐ์ด๋ ๊ฐ ์คํธ๋ฆผ์ ์ธ์ฆํ๊ณ ์ถ๋ค๋ฉด ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์์งํ ์ ์๋๋ฐ
ํ๋ก์์ first( ) ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ฒซ ํญ๋ชฉ์ ์์ ํ๊ณ ์์ง์ ์ค๋จํ ๋๊น์ง ๊ณ ์์งํ๋ค.
๋ํ take(5) ์ฐ์ฐ์๋ก toList terminal ์ฐ์ฐ์๋ฅผ ํธ์ถํด ๋ฉ์์ง๋ฅผ 5๊ฐ๋ง ์์งํ๋ค.
์ผ๋ฐ์ ์ธ list ์ถ๋ ฅ์ suspend์ Flow๋ก ์ฐจ์ด ์ดํด๋ณด๊ธฐ
๊ธฐ๋ณธ list ์ถ๋ ฅ ํจ์
fun main() {
foo().forEach { value ->
println(value)
}
}
fun foo(): List<Int> = listOf(1, 2, 3)
suspend ํจ์๋ก ๋ณ๊ฒฝ
suspend fun foo(): List<Int> {
delay(1000) // pretend we are doing something asynchronous here
return listOf(1, 2, 3)
}
fun main() = runBlocking<Unit> {
foo().forEach {
value -> println(value)
}
}
flow๋ก ๋ณ๊ฒฝ
fun foo(): Flow<Int> = flow { // flow builder
for (i in 1..3) {
delay(100) // pretend we are doing something useful here
emit(i) // emit next value
}
}
fun main() = runBlocking<Unit> {
// Collect the flow
foo().collect {
value -> println(value)
}
}
์ฝ๋๋ก ์์๋ณด๊ธฐ
val chargedMoneyFlow: Flow<Int> = dataStore.data
.catch {
exception -> if (exception is IOException) {
emit(emptyPreferences())
} else{
throw exception
}
}
.map { preferences ->
preferences[PreferencesKeys.CHARGED_MONEY] ?: 0 }
์ด ์ฝ๋๋ datastore๊ณผ coroutine์ ์ฌ์ฉํ์ฌ ์์ก ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋น๋๊ธฐ์ ์ธ ์์ ์ ์ํํ๋ค.
chargedMoneyFlow๋ ๋ฐ์ดํฐ ์ ์ฅ์์์ ๊ฐ์ ธ์จ ์ ์๊ฐ์ ํํํ๋ Flow์ด๋ค.
๋์์ ์ ๋ฆฌํด๋ณด๋ฉด
datStore.data๋ฅผ ํตํด dataStore์ ๊ฐ์ ์ฝ์ด์ค๋๋ฐ ์ฌ์ฉํ๋ flow๋ฅผ ์์ฑํ๋ค.
์ด๋ป๊ฒ dataStore.data๋ฅผ ํตํด flow๋ฅผ ์์ฑํ ์ ์๋์ง ์๊ณ ์ถ๋ค๋ฉด?
dataStore.data๋ฅผ ์ดํด๋ณด๋ฉด ๋ฐํ๊ฐ์ด Flow<T>์ด๋ค.
dataStore.data๋ DataStore์์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์ฌ์ฉ๋๊ณ ๋ฐํ๋๋ฐ์ดํฐ๋ Flow๋ก ํํ๋๋ค
๋ฐ๋ผ์ ์ด Flow๋ฅผ ํตํด ๋ฐ์ดํฐ ์ ์ฅ์์ ๋ณํ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์งํ๊ณ ์ฒ๋ฆฌํ ์ ์๋ค.
map์ ์ฌ์ฉํ์ฌ ๊ฐ์ Preferences.CHARGED_MONEY ํค์ ํด๋นํ๋ ๊ฐ์ผ๋ก ๋ณํํ๋ค.
์ด ๋ ๋ง์ฝ ์ด ํค์ ๋์ํ๋ ๊ฐ์ด ์๋ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก 0์ ์ฌ์ฉํ๋ค.
.map { preferences ->
preferences[PreferencesKeys.CHARGED_MONEY] ?: 0 }
.map ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋?
๋ฐ์ดํฐ ๋ณํ๋๋ฌธ์ด๋ค.
์ด ๋ถ๋ถ์ chargedMoneyFlow์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ์ฌ ์ต์ข ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์ ํ๋ ํํ๋ก ๋ง๋ค์ด์ฃผ๋ ์ญํ ์ ํ๋ค.
chargedMoneyFlow๋ datastore์์ ๊ฐ์ ธ์จ ์ค์ ๊ฐ์ ๋ํ flow์ด๋ค.
preferences๋ chargedMoneyFlow์์ ๋ฐฉ์ถ๋ ๋ฐ์ดํฐ ์ฆ, datastore์์ ๊ฐ์ ธ์จ ๊ฐ์ ๋ํ๋ด๋ฉด,
์ด ๊ฐ์ PreferencesKeys.CHARGED_MONEY์ ํด๋นํ๋ value๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
1๏ธโฃ preferences[PreferencesKeys.CHARGED_MONEY] ๋ฅผ ํตํด์ charged_money ํค์ ํด๋นํ๋ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
2๏ธโฃ ํด๋นํ๋ ํค๊ฐ ์๋ค๋ฉด 0์ ์ฌ์ฉํ๋ค.
dataStore.data๋ฅผ ์ฌ์ฉํ์ฌ datastore์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๋ก์ง์ด๋ค.
์ถ๊ฐ๋ก .catch๋ฅผ ํตํด ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์๊ณ , IOException์ธ ๊ฒฝ์ฐ์๋ emptyPreferences( )๋ฅผ emit ํด์ฃผ์๋ค.
๊ณต๋ถํ ์๋ฃ
https://philosopher-chan.tistory.com/1546
https://developer.android.com/kotlin/flow?hl=ko
'๐ค2024 ์๋๋ก์ด๋ > ๊ธฐ์์ฌ ํ๋ก์ ํธ ๊ธฐ๋ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐android compose์์ ๋ ์จ api๋ฅผ ์ฐ๋ํด๋ณด์! (0) | 2024.02.01 |
---|---|
Compose์์ ๊ตฌ์ฑ๋ณ๊ฒฝ ์ ์ ์ฅ๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ (2) | 2024.01.21 |
compose์ preferences datastore ์ด์ฉํ๊ธฐ (1) | 2024.01.18 |
kotlin coroutines basic ๊ณต์๋ฌธ์ ์ฝ์ด๋ณด๊ธฐ (0) | 2024.01.17 |
๐ Android FCM ์ ์ฉ๊ธฐ 2ํ : FCM + Retrofit (0) | 2024.01.07 |