Widget

Flutter Is an open source framework for building beautiful, natively compiled, multi-platform applications from a single codebase.

ํ”Œ๋Ÿฌํ„ฐ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ์“ฐ์—ฌ์žˆ๋Š” ์†Œ๊ฐœ๋ฌธ๊ตฌ์ด๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ios, android ํ”Œ๋žซํผ์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” dart ์–ธ์–ด ๊ธฐ๋ฐ˜ ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„ ์›Œํฌ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” dart ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋จผ์ €, ํ”Œ๋Ÿฌํ„ฐ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ธ ์œ„์ ฏ์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๋ คํ•œ๋‹ค.

์œ„์ ฏ์€ ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์˜ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ๋‹จ์œ„์ด๋‹ค. React์˜ ์ปดํฌ๋„ŒํŠธ์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…์œผ๋กœ, ์–ด๋–ค ์‹์œผ๋กœ UI๋ฅผ ํ‘œ์‹œํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. ์œ ์˜ํ•  ์ ์€ ๋ˆˆ์— ๋ณด์ด๋Š” ์š”์†Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ padding, row ๋“ฑ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š” ์š”์†Œ๊นŒ์ง€ ๋ชจ๋‘ ์œ„์ ฏ์— ํฌํ•จ๋œ๋‹ค.

์œ„์ ฏ์€ ์ƒํƒœ์— ๋”ฐ๋ผ ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ƒํƒœ๋ž€, ์œ„์ ฏ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

Stateless Widget

์•ฑ์ด ๋™์ž‘ํ•˜๋ฉด์„œ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์œ„์ ฏ๋“ค์„ stateless widget์ด๋ผ๊ณ  ํ•œ๋‹ค. ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ๋งํ•˜์ž๋ฉด, ์œ ์ €์™€ ์ƒํ˜ธ์ž‘์šฉ ์—†์ด (์ฆ‰, ์ด๋ฒคํŠธ์— ์˜ํ•ด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.) ํ™”๋ฉด์ด ๋ Œ๋”๋ง๋ ๋•Œ ํ•œ๋ฒˆ๋งŒ ๊ทธ๋ ค์ง€๋Š” ์œ„์ ฏ๋“ค์„ ๋งํ•œ๋‹ค.

์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ฒ˜์Œ ํ• ๋‹น๋ฐ›์€ ๋ชจ์Šต ๊ทธ๋Œ€๋กœ UI๊ฐ€ ๊ทธ๋ ค์ง„๋‹ค. (eg. Text Widget, Image Widget ...)

Stateful Widget

stateless widget๊ณผ ๋ฐ˜๋Œ€๋กœ, ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ†ตํ•ด ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ์œ„์ ฏ์„ ๋งํ•œ๋‹ค. ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ’์— ๋”ฐ๋ผ UI๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ €์˜ ์ด๋ฒคํŠธ, ์ƒํ˜ธ์ž‘์šฉ์— ์˜ํ•ด ๋™์ž‘ํ•œ๋‹ค. ์ž…๋ ฅ์ฐฝ์„ ๊ตฌํ˜„ํ• ๋•Œ ์‚ฌ์šฉ๋˜๋Š” TextField๊ฐ€ ์˜ˆ์‹œ์ด๋‹ค.

์š”์•ฝ : ์ƒํƒœ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด UI๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด? โžก๏ธ stateful widget์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ด์–ด์„œ, stateful widget์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์ž.

๋จผ์ €, ์šฐ๋ฆฌ๊ฐ€ ์œ„์ ฏ์„ ํ˜ธ์ถœํ• ๋•Œ class MyApp extends StatefulWidget ๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰, StatefulWidget์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด StatefulWidget ํด๋ž˜์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋˜์–ด์žˆ๋Š”์ง€ ์‚ดํŽด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” stateless widget๊ณผ stateful widget์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ด๋‹ค.

// stateless
class MyWidget extends StatelessWidget {
  const MyWidget({super.key});

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

// stateful
class MyWidget extends StatefulWidget {
  const MyWidget({super.key});

  @override
  State<MyWidget> createState() => _MyWidgetState();
}

stateless widget๊ณผ ๋‹ค๋ฅธ์ ์€, ์œ„์ ฏ ๋‚ด๋ถ€์— createState() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ด ์œ„์ ฏ์˜ ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” stateful widget์„ ํ˜ธ์ถœํ• ๋•Œ ์‹คํ–‰๋˜๋ฉฐ, ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•จ๊ณผ ๋™์‹œ์— ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.

์ด ์œ„์ ฏ์ด ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ์„ฑ ์ดํ›„ ์ดˆ๊ธฐํ™”๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด ๋‹จ๊ณ„๋ฅผ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋ผ๊ณ  ๋งํ•˜๋ฉฐ, initState() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋œ๋‹ค.

๋‹ค์Œ์œผ๋กœ ๋นŒ๋“œ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์œ„์ ฏํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ, setState() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋นŒ๋“œ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค. (์ƒํƒœ ๋ณ€๊ฒฝ ์ด์™ธ์—, ์œ„์ ฏ์˜ ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ, didChangeDependencies() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.)

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋”์ด์ƒ ์œ„์ ฏ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„๋•Œ, dispose() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์œ„์ ฏ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด,

  • stateful ์ƒ์„ฑ์ž ํ˜ธ์ถœ

  • createState๋กœ ์ƒํƒœ ์ƒ์„ฑ

  • initState๋ฅผ ํ†ตํ•ด ์ƒํƒœ ์ดˆ๊ธฐํ™”

  • ์œ„์ ฏํŠธ๋ฆฌ ๋นŒ๋“œ, ๋ฐ˜ํ™˜

  • ์ด๋ฒคํŠธ๋กœ ์ธํ•ด ์ƒํƒœ ๋ณ€๊ฒฝ์‹œ setState๋ฅผ ํ˜ธ์ถœํ•ด ๋ฆฌ๋นŒ๋“œ

  • ์œ„์ ฏ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด, despose๋ฅผ ํ†ตํ•ด ์œ„์ ฏ ์‚ญ์ œ.

์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

Last updated