Flutter๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ํ™”๋ฉด์— ๋ฌด์—‡์ธ๊ฐ€ ํ‘œ์‹œํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒƒ์„ Widget์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Flutter์˜ Widget์€ React์˜ Component DOM tree์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…์ด๋ฉฐ, ์ƒํƒœ ๊ด€๋ฆฌ์— ๋”ฐ๋ผ์„œ ์ƒํƒœ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ Stateful Widget๊ณผ ์ƒํƒœ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ Stateless Widget์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

** ์—ฌ๊ธฐ์„œ state ๋ž€ ์•ฑ์˜ ๋ชจ์Šต์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋œปํ•œ๋‹ค!

1. Stateless Widget

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•ด์„ํ•ดํ•ด๋ณด๋ฉด

"๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์œ„์ ฏ"

์ด๋ผ๊ณ  ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌํ•ด๋ณด๋ฉด

  1. ์Šคํฌ๋ฆฐ์ƒ์— ์กด์žฌ๋งŒ ํ•  ๋ฟ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Œ
  2. ์–ด๋– ํ•œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋„ ์ €์žฅํ•˜์ง€ ์•Š์Œ
  3. ์–ด๋–ค ๋ณ€ํ™”(๋ชจ์–‘,์ƒํƒœ)๋ฅผ ์œ ๋ฐœํ•˜๋Š” value๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š์Œ.
  4. ๋ชจ๋“  ๊ฐ’์ด final ์ƒ์ˆ˜์ด๋‹ค.

๋ผ๊ณ  ๋ณด๋ฉด ๋ ๊บผ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋ฅผ ํ•œ๋ฒˆ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • stateless
class ๋น„์ƒํƒœํด๋ž˜์Šค extends StatelessWidget {
  const ๋น„์ƒํƒœํด๋ž˜์Šค({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

2. Stateful Widget

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•ด์„ํ•ด๋ณด๋ฉด

"๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„ ์œ„์ ฏ"

์ด๋ผ๊ณ  ํ•˜๋„ค์š”!

์ •์˜ ํ•ด๋ณด๋ฉด

์ •์˜: Value ๊ฐ’์„ ์ง€์†์ ์œผ๋กœ ์ถ”์  ๋ฐ ๋ณด์กด (๊ณ„์† ์›€์ง์ž„์ด๋‚˜ ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ์œ„์ ฏ)

  1. ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์— ๋”ฐ๋ผ์„œ ๋ชจ์–‘์ด ๋ฐ”๋€œ
  2. ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ฒŒ ๋˜์—ˆ์„ ๋•Œ ๋ชจ์–‘์ด ๋ฐ”๋€œ

3. flutter widget tree

  1. Widget๋“ค์€ tree ๊ตฌ์กฐ๋กœ ์ •๋ฆฌ ๋  ์ˆ˜ ์žˆ์Œ
  2. ํ•œ Widget๋‚ด์— ์–ผ๋งˆ๋“ ์ง€ ๋‹ค๋ฅธ Widget๋“ค์ด ํฌํ•จ ๋  ์ˆ˜ ์žˆ์Œ
  3. Widget์€ ๋ถ€๋ชจ ์œ„์ ฏ๊ณผ ์ž์‹ ์œ„์ ฏ์œผ๋กœ ๊ตฌ์„ฑ

Parent widget์„ widget container๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ

๋ผ์ดํ”„ ์‚ฌ์ดํด

์‹คํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ

์ฃผ์š” ๋ฉ”์†Œ๋“œ

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๋ฅผ ์ฃผ๋กœ ์“ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.