Flutter Widget Rendering
Flutter widget์ ๋ ๋๋ง ์์๋ ์์๊ฐ๋ค. 1. ๋จผ์ ์ฌ์ฉ์์ ์ธํ์ ๋ฐ์๋ค์ด๊ณ 2. ์๊ฐ์ ๋ฐ๋ผ UI๋ฅผ ์์ง์ด๊ณ , 3. ์คํฌ๋ฆฐ์ ์์ ฏ์ ๋ง๋ค๊ณ 4. ์คํฌ๋ฆฐ ์์์ ์์น๋ฅผ ์ก๊ณ , 5. ์์น์ก์ ์์ ฏ์ ์ง์ ์ ์ธ ๋ด๋ถ ๊ตฌํ๋ฌผ์ ์ฑ์ฐ๊ณ , 6. ์์น์ ๋ด๋ถ๊ฐ ์ฑ์์ง ์์ ฏ๋ค์ ๊ฒน์ณ์ง ์์๋ฅผ ordering ํ ๋ค์ 7. ์ง๊ธ๊น์ง ํ ์์ ๋ค์ GPU๊ฐ ์ดํดํ ์ ์๋ ๋ช ๋ น์ด๋ก ๋ฐ๊พธ์ด ์ค์ ํ๋ฉด์ ๋ ๋๋ง์ ํ๋ค.
๋ ๋๋ง ๊ณผ์ ์ ํฌ๊ฒ ๋ ๋๋ง ํ์ดํ๋ผ์ธ๊ณผ Graphics ํ์ดํ๋ผ์ธ์ผ๋ก ๋๋๊ณ ๊ฐ๊ฐ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ค. Rendering Pipeline ์ UIThread์์ ์คํ๋๋ฉฐ ์ด 5๋จ๊ณ phase๋ก ๋๋์ด์ง๋ค. (์์ ๋์จ2,3,4,5,6) Graphic pipeline์ GPU thread ์์ ์คํ๋๋ฉฐ ๋ง์ง๋ง Rasterize ๋จ๊ณ๋ฅผ ๋งก๊ฒ๋๋ค.
๋ ๋๋ง ํ์ดํ ๋ผ์ธ ์์์ Widget Tree -> Element Tree -> Render Object Tree ๋ฅผ ๋ง๋ค์ด ์ต์ข ์ ์ผ๋ก Layer Tree๋ฅผ ๋ง๋ค๊ฒ ๋๋ค. ์ฌ๊ธฐ์ Layer Tree๋ UI๋ฅผ ์ด๋ป๊ฒ ๊ทธ๋ฆด ๊ฒ์ธ๊ฐ์ ๋ํด ์ต์ ํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ฒ ๋๋ค. Raster ๋จ๊ณ์์๋ ์ ๋ฌ๋ฐ์ Layer tree๋ฅผ ํฝ์ ๋ก ๋ณํํ๊ณ ๊ฐ Layer ๋ฅผ Overlay ํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
Widget Tree, Element Tree, Render Tree
์์ ฏ ๋ ๋๋ง ๋จ๊ณ ์ค ํ๋์๋ ๋น๋ ๋จ๊ณ๋ ๋คํธ ์ฝ๋ ๋ด์์ build ๋ฉ์๋ ํธ์ถ๋ ์คํ๋๋ค. ์ดํ๋ถํฐ ๋น๋ ๋ฉ์๋ ์๋์ ์์ ฏํธ๋ฆฌ ๊ตฌ์กฐ๋๋ก ๋ง๋ค๊ธฐ ์์ํ๋ค. ํ์ง๋ง ์์ ฏํธ๋ฆฌ์์๋ ์์ ฏ์ ๊ตฌ์กฐ์ ๋ ์ด์์์ ์ ์ํ์ง๋ง ์ค์ ํ๋ฉด์ ์ด๋ป๊ฒ ๊ทธ๋ ค์ง์ง์ ๋ํ ์ ๋ณด๋ ํฌํจํ๊ณ ์์ง ์๋ค. ๊ฒฐ๊ตญ ์์ ฏํธ๋ฆฌ๋ ์ด๋ป๊ฒ ๊ทธ๋ ค์ง์ง ์ฒญ์ฌ์ง ์ญํ ๋ง ํ๊ฒ๋๋ค.
์์ ฏํธ๋ฆฌ๋ผ๋ ์ฒญ์ฌ์ง์ ๊ฐ์ง๊ณ ์ค์ ์ด๋ป๊ฒ ํ๋ฉด์ ๊ทธ๋ฆด ๊ฒ์ธ๊ฐ์ ๋ํ ์ ๋ณด๋ Render Object๊ฐ ๊ฐ์ง๊ณ ์๋ค. ์ด๋ฌํ RenderObject๊ฐ ์ ๋ ๋๋ง ๋จ๊ณ์ 3๋ฒ, 4๋ฒ ์์น์ก๊ธฐ์ ๋ด์ฉ ์ฑ์ฐ๊ธฐ๋ฅผ ๋งก๊ฒ๋๋ค.
์ฒญ์ฌ์ง ์ญํ ์ ํ๋ ์์ ฏํธ๋ฆฌ์ ์ค์ ์ด๋ป๊ฒ ํ๋ฉด์ ๊ทธ๋ฆด์ง ๊ฒฐ์ ํ๋ RenderObject ์ฌ์ด์๋ Element Tree๊ฐ ์๋ค. Element ๊ฐ์ฒด๋ ๊ฐ ์์ ฏ์ 1๋1๋ก element ๊ฐ์ฒด์ ๋งตํ๋๊ณ element๊ฐ์ฒด๋ ์์ ฏ์ ์ํ, ์์น, ๋ถ๋ชจ์์๊ฐ์ ๊ด๊ณ, ์๋ช ์ฃผ๊ธฐ ๋ฑ์ ๊ด๋ฆฌํ๊ฒ ๋๋ค. ์ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๊ฐ ์์ ฏ์ ์์๊ฐ์ด Element ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๋๋ก ์ค์ ๋์ด ์๋ค.
์ ๋ฆฌํ์๋ฉด ์์ ฏํธ๋ฆฌ๋ ์ฒญ์ฌ์ง ์ญํ ์ ํ๋ฉฐ UI๊ตฌ์กฐ, ์คํ์ผ๋ง ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ณ Element Tree๋ ๋งตํ๋ ์์ ฏ์ ๋ผ์ดํ ์ฌ์ดํด, ๋ค๋ฅธ(๋ถ๋ชจ/์์) ์์ ฏ๊ฐ ๊ตฌ์ฑ๊ด๊ณ๋ฅผ ์ ์ํ๋ ์ ๋ณด๋ฅผ ๋ด๊ฒ๋๋ค. Render Object ๋ ์์ ฏํธ๋ฆฌ์ Element ์์ ฏ์ ์ด์ฉํด์ ํฌ๊ธฐ,์์น,์ฑ์ฐ๊ธฐ์ ์ญํ ์ ์ํํ๋ค.
Widget์ ์๋ช ์ฃผ๊ธฐ: ์์ฑ๋ถํฐ ์๋ฉธ๊น์ง
StatlessWidget์ ๋ณ๋ค๋ฅธ ์ํ์์ด ์์ฑ๊ณผ ์๋ฉธ๋ง์ ๋ฐ๋ณตํ๋ค. ํ์ง๋ง StatefulWidget ๊ฐ์ ๊ฒฝ์ฐ์๋ state ๊ฐ์ฒด์ ๋ฐ๋ผ ์ฌ๋ฌ๊ฐ์ง ์ํ๋ฅผ ๊ฑฐ์น๋ค.์๋ฅผ ๋ค์ด setState() ๋ฅผ ํธ์ถํ๋ฉด ์์ ฏ์ ๋ค์ ๊ทธ๋ฆฌ๊ฒ๋๋ค. Constructor ๋จ๊ณ๋ถํฐ ์์ธํ ๋ค์ฌ๋ค๋ณด์
Constructor ๋จ๊ณ๋ ์์ ๊ฐ์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋๋ค. ๋จผ์ ํธ์ถ๋๋ CreateState()๋ ์์ ฏ์ state ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ฐํ๋๋ฉฐ ์์ ฏ์ ์๋ช ์ฃผ๊ธฐ์ค ๋จ ํ ๋ฒ๋ง ํธ์ถ๋๋ค. state๊ฐ์ฒด๋ ์์ ฏ์ ์๋ช ์ฃผ๊ธฐ๋์ ์ง์๋๋ฉฐ ์์ ฏ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
mounted ๋จ๊ณ์์๋ ํ์ฌ ์์ ฏํธ๋ฆฌ์ ์ฌ๋ผ๊ฐ์๋์ง ํ์ธํ๋ค. ํด๋น ์์ ฏ์ด ์์ ฏํธ๋ฆฌ์ ํฌํจ๋์ด ์๋์ง ํ์ธํ๋ค๊ณ ๋ณผ ์ ์๋ค
initState() ๋จ๊ณ์์๋ mounted=true๊ฐ ๋๊ฒ์ ํ์ธํ ์ดํ ๋ฆฌ์์ค ์ด๊ธฐํ, ๋ฐ์ดํฐ fetch ๊ฐ์ ์ด๊ธฐํ ๋ก์ง์ ์ฌ์ฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ฏ์ ์๋ช ์ฃผ๊ธฐ์ค ๋จ ํ ๋ฒ๋ง ํธ์ถ๋๋ค. Build ๋ฉ์๋ ์ด์ ์ ์คํ๋๋ฏ๋ก ์ด๊ธฐ์ํ์ค์ ์ ์ด๊ณณ์์ ํด์ค๋ค.
๋ง์ง๋ง didChangeDependencies() ์์๋ ์์กด๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํธ์ถ๋์ด ์์กด์ฑ/๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋ ์ฌ๊ตฌ์ฑํ ๋ ์ฐ์ธ๋ค.
Constructor ๋จ๊ณ๋ฅผ ์ง๋ ์ด๋ฒ์๋ Build ๋จ๊ณ๋ฅผ ์์ธํ ๋ค์ฌ๋ค๋ณด์. Build ์ ํ๋ก dirty flag๊ฐ ์๋ค. ์ด๋ ํ์ฌ ์์ ฏ์ด๋ ๋ ๋๋ง ์ค๋ธ์ ํธ์ ์ํ๋ฅผ ๋ํ๋ด๋ flag๋ก true๋ฉด ์์ ฏ์ UI์ ๋ฐ์ดํธ๊ฐ ํ์ํ ์ํ, false ์ด๋ฉด ์์ ฏ์ด ์ต์ ์ํ์์ ๋ํ๋ธ๋ค.
build() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ํญ์ ์๋ก์ด ์์ ฏ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค. ์์ ฏ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ ๋ถ๋ชจ ์์ ฏ์ ์ํ ๋ฐ์ดํฐ ๋ณ๊ฒฝ๋ฑ์ด ๋ฐ์ํ ๋ ํธ์ถ๋๋ค.
setState() ๋ฉ์๋๋ UI๊ฐฑ์ ์ ์ํ ๋ฉ์๋๋ก dirty๋ฅผ true๋ก ๋ฐ๊พธ๊ณ build()๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ๋๋ค. UI์ ๋ฐ์ดํธ๋ฅผ ํ ์ผ์ด ์๋ค๋ฉด setState() ๋ฉ์๋๋ฅผ ํธ์ถํ์
didupdateWidget() ๋ setState() ์ ๋ง์ฐฌ๊ฐ์ง๋ก UI์ ๋ฐ์ดํธ ๋ฉ์๋์ด๋ค. ๋ ๋ฉ์๋์ ์ฐจ์ด๋ฅผ ์์๋ณด์๋ฉด setState() ๋ฉ์๋๋ ์์ ฏ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ฌ์ฉ๋๋ค. ์ฃผ๋ก ๋ก์ปฌ ์์ ฏ ์ํ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ์ฌ์ฉ๋๋ฉฐ, ์ด ๋ณ๊ฒฝ์ด UI์ ๋ฐ์๋์ด์ผ ํ ๋ ์ ํฉํ๋ค.
didUpdateWidget()๋ StatefulWidget์ ์ํ ๊ฐ์ฒด์์ ํธ์ถ๋์ด ์์ ฏ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋ ํ, ์ฆ ์์ ฏ์ ์์ฑ์๋ก ์ ๋ฌ๋ ํ๋ผ๋ฏธํฐ๊ฐ ๋ณ๊ฒฝ๋์ ๋ ํธ์ถ๋๋ค. ์ฃผ๋ก ๋ถ๋ชจ ์์ ฏ์์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ํ์ํ ๋ก์ง์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์ ๋ฆฌํ์๋ฉด setState()๋ ์ฃผ๋ก ์์ ฏ ๋ด๋ถ ์ํ์ ๋ณํ์ ๋ฐ์ํ์ฌ UI๋ฅผ ์ ๋ฐ์ดํธํ ๋, didUpdateWidget()๋ ์์ ฏ์ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ๋ฐ์ํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ์ฌ UI ๋ณํ๋ฅผ ๋ฐ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
Constructor์ Build๋ฅผ ๊ฑฐ์ณ Dispose() ๋จ๊ณ๋ฅผ ์์ธํ ์ดํด๋ณด์. ๊ฐ์ฅ ๋จผ์ deactive() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค. ์์ ฏ์ด ์์ ฏํธ๋ฆฌ์์ ์ ๊ฑฐ๋ ๋ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ๋ฆฌ์์ค๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ ๋ ์ฌ์ฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์์ ฏ์ ์ ๊ฑฐํ ๋ Dispose()๋ฅผ ์ฐ๊ฒ๋๋ค. iOS์ deinit๊ณผ ์ ์ฌํ ๋ฉ์๋๋ผ ๋ณผ ์ ์๋ค.
Build Context์ ์ญํ
๋ชจ๋ ์์ ฏ์ BuildContext๊ฐ ํฌํจ๋ ๋น๋ ๋ธ๋ก ์์์ ์งํ๋๋ค.
์ด์ ๋ด์ฉ์ ๋์ง์ด๋ณด๋ฉด ์์ ฏ ์์ฒด๋ง์ผ๋ก๋ ์์ ฏํธ๋ฆฌ ๋ด์์ ํน์ ์ธ์คํด์ค ์์น์ ๋ํด ์๊ธฐ ์ด๋ ค์์ Element Tree๋ฅผ ํตํด ์์ ฏ๊ฐ์ ์๊ณ๋ฅผ ์ ์ ์์๋ค. ์ด๋ ์์ธํ๋ณด๋ฉด Element ๊ฐ์ฒด๋ BuildContext ์ถ์ํ ํด๋์ค์ ๊ตฌํ์ฒด์ด๋ค. ๋ฐ๋ผ์ BuildContext๋ ์ผ์ข ์ ์ธํฐํ์ด์ค๋ผ๊ณ ๋ณผ ์ ์๋ค. ์ฆ Element์ ์ญํ ์ํ์ BuildContext ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ํํ๊ฒ ์ค๊ณ๋์ด์๋ค.
๋ค๋ฅธ ํ๋ ์์ํฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฒฐ๊ตญ ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ๋ฌธ์ ์ด๋ค. BuildContext๋ ์์ ฏ๊ฐ ๊ณ์ธต ์์กด์ ๋ฐ๊ฟ ์ ์๊ธฐ๋๋ฌธ์ ํ์ง๋ง์์ผํ ์ฌํญ์ด์๋ค. ๋ฐ๋ก ์ ์ญ์ ์ธ BuildContext์ฌ์ฉ, ๋น๋๊ธฐ์์ ์์ BuildContext ์ฌ์ฉ, BuildContext๋ฅผ initState์ฌ์ฉ(์์กด์ฑ ์ค์ ์ ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๋ฉด.. ํ )๊ณผ ๊ฐ์ ์ฌํญ์ด๋ค.
https://fastcampus.co.kr/dev_online_flutternative
'๐ฆ Flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Combine | 6. Timing Operators (0) | 2024.05.12 |
---|---|
| Combine | 5. Combining Operators (0) | 2024.05.11 |
| Combine | 4. Filtering Operators (0) | 2024.05.09 |
UIView ์ Drawing Cycle (0) | 2024.05.08 |
| Combine | 3. Transforming Operators (0) | 2024.05.08 |