Flutter๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ํ๋ฉด์ ๋ฌด์์ธ๊ฐ ํ์ํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฒ์ Widget์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. Flutter์ Widget์ React์ Component DOM tree์ ์ ์ฌํ ๊ฐ๋ ์ด๋ฉฐ, ์ํ ๊ด๋ฆฌ์ ๋ฐ๋ผ์ ์ํ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ Stateful Widget๊ณผ ์ํ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ Stateless Widget์ผ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
** ์ฌ๊ธฐ์ state ๋ ์ฑ์ ๋ชจ์ต์ ๋ฐ๊ฟ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ปํ๋ค!
1. Stateless Widget
๊ณต์ ๋ฌธ์๋ฅผ ํด์ํดํด๋ณด๋ฉด
"๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํ๊ฐ ํ์ํ์ง ์์ ์์ ฏ"
์ด๋ผ๊ณ ๋์์์ต๋๋ค.
์ ๋ฆฌํด๋ณด๋ฉด
- ์คํฌ๋ฆฐ์์ ์กด์ฌ๋ง ํ ๋ฟ ์๋ฌด๊ฒ๋ ํ์ง ์์
- ์ด๋ ํ ์ค์๊ฐ ๋ฐ์ดํฐ๋ ์ ์ฅํ์ง ์์
- ์ด๋ค ๋ณํ(๋ชจ์,์ํ)๋ฅผ ์ ๋ฐํ๋ value๊ฐ์ ๊ฐ์ง์ง ์์.
- ๋ชจ๋ ๊ฐ์ด final ์์์ด๋ค.
๋ผ๊ณ ๋ณด๋ฉด ๋ ๊บผ๊ฐ์ต๋๋ค. ์์๋ฅผ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
- stateless
class ๋น์ํํด๋์ค extends StatelessWidget {
const ๋น์ํํด๋์ค({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container();
}
}
2. Stateful Widget
๊ณต์ ๋ฌธ์๋ฅผ ํด์ํด๋ณด๋ฉด
"๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํ๋ฅผ ๊ฐ์ง ์์ ฏ"
์ด๋ผ๊ณ ํ๋ค์!
์ ์ ํด๋ณด๋ฉด
์ ์: Value ๊ฐ์ ์ง์์ ์ผ๋ก ์ถ์ ๋ฐ ๋ณด์กด (๊ณ์ ์์ง์์ด๋ ๋ณํ๊ฐ ์๋ ์์ ฏ)
- ์ฌ์ฉ์์ ์ํธ์์ฉ์ ๋ฐ๋ผ์ ๋ชจ์์ด ๋ฐ๋
- ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฒ ๋์์ ๋ ๋ชจ์์ด ๋ฐ๋
3. flutter widget tree
- Widget๋ค์ tree ๊ตฌ์กฐ๋ก ์ ๋ฆฌ ๋ ์ ์์
- ํ Widget๋ด์ ์ผ๋ง๋ ์ง ๋ค๋ฅธ Widget๋ค์ด ํฌํจ ๋ ์ ์์
- Widget์ ๋ถ๋ชจ ์์ ฏ๊ณผ ์์ ์์ ฏ์ผ๋ก ๊ตฌ์ฑ
Parent widget์ widget container๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํจ
๋ผ์ดํ ์ฌ์ดํด
- StatelessWidget์ ํ ๋ฒ ๊ทธ๋ ค์ง๋ฉด ๋์ ๋๋ค
- StatefulWidget์ ๋ผ์ดํ ์ฌ์ดํด
์คํ๋๋ ๋ฉ์๋
์ฃผ์ ๋ฉ์๋
createState()
์๋ก์ด Stateful ์์ ฏ์ ๋ง๋ค ๋ ์์ฑ๋๋ฉฐ state ์ธ์คํด์ค๋ฅผ ๋ฐํํฉ๋๋ค.
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
mounted(true)
State object๋ฅผ ์์ฑํ๋ฉด, ํ๋ ์์ํฌ๋ mounted๋ผ๋ boolean ์์ฑ์ true๋ก ์ค์ ํด์, State object๋ฅผ BuildContext์ ์ฐ๊ฒฐํ๋ค. ์ด ์์ฑ์ ์ด State object๊ฐ ํ์ฌ ์์ ฏ ํธ๋ฆฌ์ ์๋์ง, ์๋ ์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
์ด ๋จ๊ณ๋ ์๋ช ์ฃผ๊ธฐ์ ์ค์ ๋จ๊ณ๋ก ํ์๋์ง์์ง๋ง, background์์ ์งํ ์ค์ธ ์์ ์ ์๋ ๊ฒ์ด ์ค์ํ๋ค.
initState()
์์ ฏ์ด ์์ฑ๋ ๋ ์ฒ์ ํ ๋ฒ ํธ์ถ๋ฉ๋๋ค.
super.initState() ํํ๋ก ์ฌ์ฉํฉ๋๋ค.
์ฉ๋
1. ์์ฑ๋ ์์ ฏ ์ธ์คํด์ค์ BuildContext์ ์์กด์ ์ธ ๊ฒ๋ค์ ๋ฐ์ดํฐ ์ด๊ธฐํ
2. ํธ๋ฆฌ์์ ๋ถ๋ชจ ์์ ฏ๊ณผ ๊ด๋ จ๋ ์์ฑ์ ์ด๊ธฐํ
3. Stream ๊ตฌ๋
, ์๋ฆผ๋ณ๊ฒฝ, ๋๋ ์์ ฏ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ค๋ฅธ ๊ฐ์ฒด ํธ๋ค๋ง
@override
void initState() {
super.initState();
// TODO: implement initState
}
didChangeDependencies()
์์ ฏ์ด ์ฒ์ ๋น๋๋ ์งํ์ ํธ์ถ๋ฉ๋๋ค.
๋ํ ์์ ฏ์ด ์์กดํ๋ ๋ฐ์ดํฐ์ ๊ฐ์ฒด๊ฐ ํธ์ถ๋ ๋๋ง๋ค ํธ์ถ๋ฉ๋๋ค.
๋น์ฉ์ด ํฐ ์ก์ (APIํธ์ถ ๋ฑ)์ด ํ์ํ ๊ฒฝ์ฐ ์ ์ฉํฉ๋๋ค.
build()
์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ํ๋ฏ๋ก ์์ฃผ ํธ์ถ๋ฉ๋๋ค. (fps+render)
ํ์์ด๋ฉฐ, ์ค๋ฒ๋ผ์ด๋ ํด์ผํ๊ณ , ๋ฐ๋์ Widget์ ๋ฆฌํดํด์ผํฉ๋๋ค.
ํ๋ฉด์ ์์ ฏ์ ๋ ๋๋งํ ๋ ๋งค๋ฒ ํธ์ถ๋ฉ๋๋ค.
didUpdateWidget()
๋ถ๋ชจ ์์ ฏ์ด ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๊ณ , ์์ ฏ์ ๋ค์ buildํด์ผํ๋ ๊ฒฝ์ฐ์ ํธ์ถ๋๋ค.
ํ๋ ์์ํฌ๋ ์ด์ ์์ ฏ์ ์ ์์ ฏ๊ณผ ๋น๊ตํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ argument๋ฅผ ์ค๋ค.
Tip: ์ ์์ ฏ์ ์ด์ ์์ ฏ๊ณผ ๋น๊ตํด์ผ ํ๋ ๊ฒฝ์ฐ์ didUpdateWidget() ์ฌ์ฉํ์.
@override
void didUpdateWidget(covariant MyHomePage oldWidget) {
super.didUpdateWidget(oldWidget);
// TODO: implement didUpdateWidget
}
setState()
setState ๋ฉ์๋๋ ํ๋ฌํฐ์ ๊ฐ๋ฐ์๊ฐ ์์ฃผ ํธ์ถํฉ๋๋ค.
UI์ ์ํฅ์ ์ค ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ณ๊ฒฝ์ด ์ผ์ด๋ฌ์์ ์๋ฆฝ๋๋ค.
๋๊ธฐ์ ์ธ callback์ ์ฌ์ฉํ๋ฏ๋ก ๋น๋๊ธฐ์ ์ผ๋ก ์์ฉํ ์ ์์ต๋๋ค.
์ด ๋ค์์ build()๊ฐ ์ ๋ฐ์ดํธํด์ค๋๋ค.
dispose()
dispose๋ State๊ฐ์ฒด๊ฐ ์๊ตฌ์ ์ผ๋ก ์ ๊ฑฐ๋ ๋ ํธ์ถ๋ฉ๋๋ค.
mounted(false)
dispose() method ๋ค์์๋ State object๊ฐ ํ์ฌ ํธ๋ฆฌ์ ์์ผ๋ฏ๋ก mounted ์์ฑ์ ์ด์ false๋ค. state object๋ ๋ค์ mountํ ์ ์๊ณ , setState()๊ฐ ํธ์ถ๋๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
StatefulWidget๊ณผ State์ ๋์๊ณผ์
StatefulWidget์ ์คํ์ ๋๋ค
StatefulWidget์ ๋น์๋๋ค
๊ฐ๋ฅํ ๊ฒฝ์ฐ Stateless๋ฅผ ์ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Stateful์ ํ์ํ ๋์๋ง ์ฌ์ฉํ๋๋ก ํฉ๋๋ค.
State๋ฅผ ํธํ๊ฒ ๊ด๋ฆฌํ๋๋ก ๋์์ฃผ๋ ํจํค์ง๋ bloc, provider, getx ๋ฑ์ด ์์ต๋๋ค.
์์ ๊ฐ์ ํจํค์ง๋ฅผ ์ฐ๋ฉด Stateless๋ฅผ ์ฃผ๋ก ์ฐ๊ฒ ๋ฉ๋๋ค.