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()
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() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํ๋ฉด์ ๋ค์ ๊ทธ๋ฆฝ๋๋ค.