Search

Widget & State

Widget & State

ํ”Œ๋Ÿฌํ„ฐ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ ์š”์†Œ์ธ Widget ๊ณผ State ๋ฅผ ์•Œ์•„๋ด…๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ๋‘ ๊ฐ€์ง€ ๊ฐœ๋…์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Widget
โ€ข
State
โ€ข
Widget Type
โ—ฆ
StatelessWidget
โ—ฆ
StatefulWidget
โ€ข
Widget LifeCycle

Widget(์œ„์ ฏ)

ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ๋ชจ๋“  UI ์š”์†Œ
ํ”Œ๋Ÿฌํ„ฐ๋Š” ์œ„์ ฏ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ฐ”์ผ ์•ฑ, ์›น ์•ฑ, ๋ฐ์Šคํฌํ†ฑ ์•ฑ ๋“ฑ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ชฉ์  UI ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์œ„์ ฏ์€ UI๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋ ˆ์ด์•„์›ƒ์„ ์ •์˜ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐ ๋ถ€๋ถ„์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์œ„์ ฏ์˜ ์ข…๋ฅ˜

์ข…๋ฅ˜
์„ค๋ช…
์˜ˆ์‹œ
๊ธฐ๋ณธ ์œ„์ ฏ
๊ธฐ๋ณธ์ ์ธ UI ์š”์†Œ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์œ„์ ฏ
Text, Image, Icon, Button
๋ ˆ์ด์•„์›ƒ ์œ„์ ฏ
๋‹ค๋ฅธ ์œ„์ ฏ๋“ค์„ ๋ฐฐ์น˜ํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ์œ„์ ฏ
Container, Row, Column, Stack
์ž…๋ ฅ ์œ„์ ฏ
์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ›๋Š” ์œ„์ ฏ
TextField, Checkbox, Radio, Switch
๋„ค๋น„๊ฒŒ์ด์…˜ ์œ„์ ฏ
ํ™”๋ฉด ์ด๋™๊ณผ ๊ด€๋ จ๋œ ์œ„์ ฏ
AppBar, Drawer, BottomNavigationBar

State(์ƒํƒœ)

ํ™”๋ฉด์„ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์œ„์ ฏ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ
์•ฑ์˜ ์ƒํƒœ๋Š” ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ, ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ ๋“ฑ์— ๋”ฐ๋ผ ๋ณ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๋Š” ์ฃผ๋กœ StatefulWidget ํด๋ž˜์Šค ๋‚ด์— ์ •์˜๋˜๋ฉฐ, ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ex) ์นด์šดํ„ฐ ์•ฑ
โ€ข
+ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ™”๋ฉด์˜ ์ˆซ์ž๊ฐ€ 1์”ฉ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
ํ™”๋ฉด์˜ ์ˆซ์ž๊ฐ€ ๊ฐฑ์‹ ๋˜๊ธฐ ์œ„ํ•ด์„œ ํ•ด๋‹น ์œ„์ ฏ์—์„œ ์ˆซ์ž๋ฅผ state ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Widget Type (์œ„์ ฏ ํƒ€์ž…)

ํ”Œ๋Ÿฌํ„ฐ์˜ ์œ„์ ฏ์€ ์ƒํƒœ์˜ ์œ ๋ฌด์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ํƒ€์ž…์œผ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
๊ตฌ๋ถ„
StatelessWidget
StatefulWidget
์ƒํƒœ ์—ฌ๋ถ€
์ƒํƒœ ์—†์Œ
์ƒํƒœ ์žˆ์Œ
ํŠน์ง•
ํ•œ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
์ƒํƒœ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
์‚ฌ์šฉ ์‚ฌ๋ก€
์ •์ ์ธ UI (ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€ ํ‘œ์‹œ)
๋™์ ์ธ UI (์‚ฌ์šฉ์ž ์ž…๋ ฅ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ)
๊ฐฑ์‹  ์—ฌ๋ถ€
๊ฐฑ์‹  ๋ถˆ๊ฐ€๋Šฅ
setState()๋ฅผ ํ†ตํ•ด ๊ฐฑ์‹  ๊ฐ€๋Šฅ

StatelessWidget

์ƒํƒœ๊ฐ€ ์—†๋Š” ์œ„์ ฏ
StatelessWidget์€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ์œ„์ ฏ์ž…๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๊ทธ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ •์ ์ธ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ํ‘œ์‹œ๋‚˜ ์ด๋ฏธ์ง€ ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ์ •์ ์ธ ํ™”๋ฉด์„ ๋งŒ๋“ค ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. StatelessWidget์€ build() ๋ฉ”์„œ๋“œ๋งŒ์„ ๊ตฌํ˜„ํ•˜๊ณ , ์ƒํƒœ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
class MyStatelessWidget extends StatelessWidget { Widget build(BuildContext context) { return Container( child: Text('Hello, Stateless Widget!'), ); } }
Dart
๋ณต์‚ฌ

StatefulWidget

์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ์œ„์ ฏ
StatefulWidget์€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์ ฏ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ž…๋ ฅ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋“ฑ์— ๋Œ€์‘ํ•˜์—ฌ ๋™์ ์ธ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. StatefulWidget์€ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” State ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. State ํด๋ž˜์Šค๋Š” ์œ„์ ฏ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ํ•จ๊ป˜ ๋™์ž‘ํ•˜์—ฌ ์ƒํƒœ์˜ ๋ณ€๊ฒฝ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
class MyWidget extends StatefulWidget { _MyWidgetState createState() => _MyWidgetState(); } class _MyWidgetState extends State<MyWidget> { int counter = 0; void incrementCounter() { setState(() { counter++; }); } Widget build(BuildContext context) { return Column( children: [ Text('Counter: $counter'), ElevatedButton( onPressed: incrementCounter, child: Text('Increment'), ), ], ); } }
Dart
๋ณต์‚ฌ

Widget LifeCycle - ์œ„์ ฏ ์ƒ๋ช…์ฃผ๊ธฐ

์œ„์ ฏ์ด ์ƒ์„ฑ, ์ถœ๋ ฅ, ์ œ๊ฑฐ๋˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •
์ƒ๋ช…์ฃผ๊ธฐ(LifeCycle)๋ž€? : ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ๊ฐ์ฒด ๋˜๋Š” ์š”์†Œ๊ฐ€ ์ƒ์„ฑ, ์ถœ๋ ฅ, ๊ฐฑ์‹ , ์†Œ๋ฉธ ๋˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
์œ„์ ฏ์€ ํฌ๊ฒŒ Stateless Widget ๊ณผ Stateful Widget ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, Stateless Widget ์€ ์ƒํƒœ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์œ„์ ฏ์— ๋“ค์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ๋‹ค์‹œ ๊ฐฑ์‹ ๋˜๋Š” ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Statetless Widget ์˜ UI ๋Š” ๋‹จ์ˆœํžˆ ์ƒ์„ฑ๋˜๊ณ  ์ถœ๋ ฅ๋˜๊ธฐ๋งŒ ํ•˜์—ฌ ๋ณ„๋‹ค๋ฅธ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Stateful Wiget ์œ„์ ฏ์€ ์ƒ์„ฑ๋ถ€ํ„ฐ ์ถœ๋ ฅ ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์ƒํƒœ์— ๋”ฐ๋ผ ๊ฐฑ์‹ ๋˜๋Š” ๋“ฑ, ์ผ๋ จ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ƒ๋ช… ์ฃผ๊ธฐ์˜ ๊ณผ์ •์„ ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
1.
์ƒํƒœ ์ƒ์„ฑ
2.
์ƒํƒœ ์ดˆ๊ธฐํ™”
3.
์˜์กด์— ์˜ํ•œ ๊ฐฑ์‹ 
4.
UI ์ถœ๋ ฅ
5.
์œ„์ ฏ ๊ฐฑ์‹ 
6.
์ƒํƒœ ๊ฐฑ์‹ 
7.
์œ„์ ฏ ๋น„ํ™œ์„ฑํ™”
8.
์œ„์ ฏ ์†Œ๋ฉธ

์œ„์ ฏ ์ƒ๋ช…์ฃผ๊ธฐ ์š”์•ฝ

์ƒ๋ช…์ฃผ๊ธฐ
๋ฉ”์„œ๋“œ
์„ค๋ช…
์ƒํƒœ ์ƒ์„ฑ
createState()
StatefulWidget์˜ ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜
์ƒํƒœ ์ดˆ๊ธฐํ™”
initState()
- 1๋ฒˆ๋งŒ ํ˜ธ์ถœ - ์ดˆ๊ธฐ ์„ค์ • ๋ฐ ๋ฐ์ดํ„ฐ ์š”์ฒญ ์ž‘์—… ์ˆ˜ํ–‰
์˜์กด์— ์˜ํ•œ ๊ฐฑ์‹ 
didChangeDependencies()
initState() ์ดํ›„์— ํ˜ธ์ถœ๋˜๋ฉฐ, ํ•ด๋‹น StatefulWidget์ด๋‚˜ ์ƒ์œ„ ์œ„์ ฏ ํŠธ๋ฆฌ์—์„œ ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ถœ
UI ์ถœ๋ ฅ
build()
ํ‘œ์‹œํ•  ์œ„์ ฏ(UI)๋ฅผ ๋ฐ˜ํ™˜
์œ„์ ฏ ๊ฐฑ์‹ 
didUpdateWidget()
์œ„์ ฏ์ด ์—…๋ฐ์ดํŠธ๋  ๋•Œ ํ˜ธ์ถœ, ์ƒˆ๋กœ์šด ์†์„ฑ๊ณผ ์ด์ „ ์†์„ฑ์„ ๋น„๊ตํ•˜์—ฌ ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰
์ƒํƒœ ๊ฐฑ์‹ 
setState()
- ๋ณ€๊ฒฝ๋œ ์ƒํƒœ ํ†ต์ง€ - UI๋ฅผ ๊ฐฑ์‹ 
์œ„์ ฏ ๋น„ํ™œ์„ฑํ™”
deactivate()
- ์œ„์ ฏ์ด ํŠธ๋ฆฌ์—์„œ ๋ฒ—์–ด๋‚˜๋ฉด ํ˜ธ์ถœ - ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ๋กœ ์ „ํ™˜
์œ„์ ฏ ์†Œ๋ฉธ
dispose()
- ์œ„์ ฏ์ด ์ œ๊ฑฐ๋  ๋•Œ ํ˜ธ์ถœ - ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๊ณ  ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰

์ฃผ์š” ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์†Œ๋“œ

โ€ข
initState()
โ€ข
build()
โ€ข
setState()

initState()

StatefulWidget ์˜ ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด, ์ตœ์ดˆ์— ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ
โ€ข
์ด ๋ฉ”์„œ๋“œ๋Š” ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋ฉฐ, ์ฃผ๋กœ ์ดˆ๊ธฐํ™” ์ž‘์—…์ด๋‚˜ ์ƒํƒœ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
- ์ƒํƒœ ์ดˆ๊ธฐํ™” ๋ฐ ์„œ๋ฒ„๋กœ์˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
void initState() { super.initState(); // ์ดˆ๊ธฐํ™” ์ž‘์—… ์ˆ˜ํ–‰ // โœ… ์„œ๋ฒ„๋กœ์˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ }
Dart
๋ณต์‚ฌ

build()

์œ„์ ฏ์˜ ๋ ˆ์ด์•„์›ƒ๊ณผ ๋””์ž์ธ์„์„ ์ •์˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ - ํ™”๋ฉด์— UI ๊ฐ€ ์ถœ๋ ฅ๋  ๋•Œ ํ˜ธ์ถœ
โ€ข
์ด ๋ฉ”์„œ๋“œ์—์„œ๋Š” UI๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
build() ๋ฉ”์„œ๋“œ๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋ฉฐ, ๋ณ€๊ฒฝ๋œ ์ƒํƒœ์— ๋”ฐ๋ผ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('My App'), ), body: // UI ๊ตฌ์„ฑ ์š”์†Œ๋“ค... ), ); }
Dart
๋ณต์‚ฌ

setState()

์œ„์ ฏ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๊ณ , UI๋ฅผ ๊ฐฑ์‹ ์„ ์š”์ฒญํ•˜๋Š” ๋ฉ”์†Œ๋“œ
์ด ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ๋ณ€๊ฒฝ ํ›„์— UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
void _updateCounter() { setState(() { _counter++; // ์ƒํƒœ ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ }); }
Dart
๋ณต์‚ฌ
setState() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด, Flutter๋Š” ๋ณ€๊ฒฝ๋œ ์ƒํƒœ์— ๋”ฐ๋ผ build() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.