StatefulWidget๊ณผ setState - ๊ฐ์ด ๋ฐ๋๋ฉด ํ๋ฉด์ ์ด๋ป๊ฒ ๋ค์ ๊ทธ๋ ค์ง๋
์ง๋ ๊ธ์์ StatelessWidget์ ๋ฐ์ ๊ฐ์ผ๋ก ๊ทธ๋ฆฌ๊ธฐ๋ง ํ๊ณ ์ค์ค๋ก ๊ฐ์ ๋ฐ๊พธ์ง ์๋๋ค๊ณ ํ๋ค. ๊ทธ๋ผ ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค ์ซ์๊ฐ ์ฌ๋ผ๊ฐ๋ ํ๋ฉด์ ์ด๋ป๊ฒ ๋ง๋ค๊น? Compose ํ๋ ์ต๊ด๋๋ก ์ผ๋จ StatelessWidget ์์ ๋ณ์๋ฅผ ๋๊ณ ์ฌ๋ ค๋ณด์.
import 'package:flutter/material.dart';
class Counter extends StatelessWidget {
const Counter({super.key});
@override
Widget build(BuildContext context) {
int count = 0; // ์ฌ๊ธฐ์ ๋ฌธ์
return Column(
children: [
Text('$count'),
ElevatedButton(
onPressed: () {
count++; // ๊ฐ์ ์ฌ๋ผ๊ฐ๋๋ฐ...
print(count);
},
child: const Text('+1'),
),
],
);
}
}๋ฒํผ์ ๋๋ฌ๋ ํ๋ฉด์ ์ซ์๋ ๊ณ์ 0์ด๋ค. ์ฝ์์๋ 1, 2, 3์ด ์ฐํ๋๋ฐ ํ๋ฉด์ ์ ๋ฐ๋๋ค. ๊ฐ์ ๋ถ๋ช
ํ ์ฌ๋ผ๊ฐ๋๋ฐ ์ ํ๋ฉด์ ๊ทธ๋๋ก์ผ๊น?
์์ธ: Flutter๋ "๊ฐ์ด ๋ฐ๋์๋ค"๋ ๊ฑธ ์ค์ค๋ก ์์์ฑ์ง ๋ชปํ๋ค
Compose๋ mutableStateOf ๊ฐ์ด ๋ฐ๋๋ฉด ๊ทธ ๊ฐ์ ์ฝ๋ ๊ณณ์ ์๋์ผ๋ก ๋ค์ ๊ทธ๋ ค์ค๋ค. Flutter๋ ์ผ๋ฐ ๋ณ์๊ฐ ๋ฐ๋๋ ๊ฑธ ๊ฐ์ํ์ง ์๋๋ค. count++๋ ๊ทธ๋ฅ ๋ฉ๋ชจ๋ฆฌ์ ์ซ์๋ง ๋ฐ๊ฟ ๋ฟ์ด๋ผ, ํ๋ฉด์ ๋ค์ ๊ทธ๋ ค๋ฌ๋ผ๋ ์ ํธ๋ฅผ ์ง์ ๋ณด๋ด์ผ ํ๋ค.
๋ ํ๋, build ์์์ int count = 0;์ ์ ์ธํ์ผ๋ build๊ฐ ๋ค์ ์คํ๋ ๋๋ง๋ค count๋ ๋ 0์ผ๋ก ์์ํ๋ค. ์ค๋ น ํ๋ฉด์ด ๋ค์ ๊ทธ๋ ค์ ธ๋ ๊ฐ์ด ์ ์ง๋์ง ์๋๋ค. ๊ฐ์ build ๋ฐ์ ๋ณด๊ดํ ๊ณณ์ด ํ์ํ๋ค.
ํด๊ฒฐ: StatefulWidget - ๊ฐ์ ๋ณด๊ดํ๋ State ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ๋๋ค
class Counter extends StatefulWidget {
const Counter({super.key});
@override
State<Counter> createState() => _CounterState();
}
class _CounterState extends State<Counter> {
int count = 0; // build ๋ฐ์ ๋ณด๊ด
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('$count'),
ElevatedButton(
onPressed: () {
setState(() {
count++;
});
},
child: const Text('+1'),
),
],
);
}
}์ด์ ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค ์ซ์๊ฐ ์ฌ๋ผ๊ฐ๋ค. ๊ตฌ์กฐ๊ฐ ๋ ๋ฉ์ด๋ฆฌ๋ก ๋๋์๋ค.
Counter(StatefulWidget): ์์ ฏ ์์ฒด. ๋ถ๋ณ์ด๊ณ ,createState()๋ก State๋ฅผ ๋ง๋ค์ด ์ค ๋ฟ์ด๋ค_CounterState(State): ๊ฐ์ ์ค์ ๋ก ๋ค๊ณ ์๋ ๊ฐ์ฒด.count๊ฐ ์ฌ๊ธฐ ์๊ณ ,build๋ ์ฌ๊ธฐ ์๋ค
์์ ฏ์ ๋ฐ๋ ๋๋ง๋ค ์๋ก ๋ง๋ค์ด์ง์ง๋ง, State ๊ฐ์ฒด๋ ํ๋ฉด์ ๋ถ์ด ์๋ ๋์ ๊ณ์ ์ด์ ์์ด์ count๊ฐ ์ ์ง๋๋ค. ํด๋์ค ์ด๋ฆ ์์ _๊ฐ ๋ถ์ ๊ฑด ์์ฑ์ ๊ธ์์ ๋ณธ ๋๋ก ์ด ํ์ผ ์์์๋ง ์ฐ๊ฒ ๋ค๋ ํ์๋ค.
setState๊ฐ ํ๋ ์ผ
setState(() {
count++;
});setState๋ "State ์์ ๊ฐ์ด ๋ฐ๋์์ผ๋ build๋ฅผ ๋ค์ ์คํํด์ ํ๋ฉด์ ๊ฐฑ์ ํด๋ผ"๋ ์ ํธ๋ค. ๊ดํธ ์ ๋๋ค์์ ๊ฐ์ ๋ฐ๊พธ๊ณ , ๊ทธ ์งํ Flutter๊ฐ build๋ฅผ ๋ค์ ๋ถ๋ฅธ๋ค. 3๋ฒ ๊ธ์์ ๋ฐฐ์ด ์ฝ๋ฐฑ์ ๋๊ธฐ๋ ํํ๋ค.
setState ์์ด ๊ฐ๋ง ๋ฐ๊พธ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
onPressed: () {
count++; // setState ์์
},count๋ ์ฌ๋ผ๊ฐ์ง๋ง build๊ฐ ๋ค์ ๋ถ๋ฆฌ์ง ์์์ ํ๋ฉด์ ๊ทธ๋๋ก๋ค. ์ฒ์ ์ฆ์๊ณผ ๋๊ฐ๋ค. ๊ทธ๋์ Flutter์์๋ ํ๋ฉด์ ๋ณด์ด๋ ๊ฐ์ ๋ฐ๊ฟ ๋๋ setState ์์์ ๋ฐ๊พผ๋ค๊ฐ ๊ธฐ๋ณธ ๊ท์น์ด๋ค.
์์ ฏ ์๋ช ์ฃผ๊ธฐ: initState์ dispose
State ๊ฐ์ฒด๋ ๋ง๋ค์ด์ง๊ณ ์ฌ๋ผ์ง๋ ์์ ์ด ์๊ณ , ๊ทธ ์์ ์ ํธ์ถ๋๋ ๋ฉ์๋๊ฐ ์๋ค.
class _CounterState extends State<Counter> {
int count = 0;
@override
void initState() {
super.initState();
print('State ์์ฑ๋จ'); // ์ฒ์ ํ ๋ฒ๋ง ์คํ
}
@override
void dispose() {
print('State ์ ๊ฑฐ๋จ'); // ํ๋ฉด์์ ์ฌ๋ผ์ง ๋ ์คํ
super.dispose();
}
@override
Widget build(BuildContext context) {
print('build ์คํ'); // setState ๋๋ง๋ค ์คํ
return Text('$count');
}
}๋ฉ์๋ | ์ธ์ | ์ฉ๋ |
| State๊ฐ ๋ง๋ค์ด์ง ๋ ๋ฑ ํ ๋ฒ | ์ด๊ธฐ ์ธํ , ์ปจํธ๋กค๋ฌ ์์ฑ |
| ์ฒ์ + | ํ๋ฉด ๊ทธ๋ฆฌ๊ธฐ |
| ํ๋ฉด์์ ์ ๊ฑฐ๋ ๋ | ์ปจํธ๋กค๋ฌยท๊ตฌ๋ ์ ๋ฆฌ |
build๋ ์์ฃผ ์คํ๋๋ ๋ฌด๊ฑฐ์ด ์์
์ ๋ฃ์ง ์๋๋ค. ์๋ฒ ์์ฒญ ๊ฐ์ ๊ฑด ํ ๋ฒ๋ง ํ๋ฉด ๋๋ initState์์ ํ๋ค. late final์ initState์์ ์ฑ์ฐ๋ ํจํด์ด ์ฌ๊ธฐ์ ์ฐ์ธ๋ค. initState๊ฐ build๋ณด๋ค ํญ์ ๋จผ์ ์คํ๋๋ค๋ ๊ฑธ Flutter๊ฐ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์, ์ง๋ ๊ธ์์ ๋งํ "์ฑ์ฐ๋ ์ฝ๋๊ฐ ์ฝ๋ ์ฝ๋๋ณด๋ค ๋จผ์ ์คํ๋๋ ์์"๊ฐ ์๋์ผ๋ก ์ง์ผ์ง๋ค.
late final TextEditingController controller;
@override
void initState() {
super.initState();
controller = TextEditingController(); // build๋ณด๋ค ๋จผ์ ์ฑ์์ง
}
@override
void dispose() {
controller.dispose(); // ์ด ๊ฑด ์ ๋ฆฌ
super.dispose();
}super.initState()๋ ๋จผ์ , super.dispose()๋ ๋ง์ง๋ง์ ๋ถ๋ฅด๋ ๊ฒ ๊ด๋ก๋ค.
Compose, SwiftUI์ ๋น๊ตํ๋ฉด
// Compose
@Composable
fun Counter() {
var count by remember { mutableStateOf(0) }
Column {
Text("$count")
Button(onClick = { count++ }) { Text("+1") }
}
}// SwiftUI
struct Counter: View {
@State private var count = 0
var body: some View {
VStack {
Text("\(count)")
Button("+1") { count += 1 }
}
}
}Flutter | Compose | SwiftUI | |
์ํ ๋ณด๊ด |
|
|
|
๊ฐฑ์ ์ ํธ |
| ๊ฐ ๋ณ๊ฒฝ ์ ์๋ | ๊ฐ ๋ณ๊ฒฝ ์ ์๋ |
์ฝ๋ ๋ถ๋ | ํด๋์ค 2๊ฐ | ํจ์ ํ๋ | ๊ตฌ์กฐ์ฒด ํ๋ |
์๋ช ์ฃผ๊ธฐ |
|
|
|
๊ฐ์ฅ ํฐ ์ฐจ์ด๋ ๊ฐฑ์ ์ ๋ด๊ฐ ์ง์ ์๋ ค์ผ ํ๋ค๋ ์ ์ด๋ค. Compose์ SwiftUI๋ ์ํ๊ฐ ๋ฐ๋๋ฉด ์๋์ผ๋ก ๋ค์ ๊ทธ๋ฆฌ๋๋ฐ, Flutter๋ setState๋ฅผ ๋นผ๋จน์ผ๋ฉด ํ๋ฉด์ด ์ ๋ฐ๋๋ค. ์
๋ฌธ ๋ ๊ฐ์ฅ ๋ง์ด ๊ฒช๋ ์ค์๋ค.
์ ๋ฆฌ
- ์ผ๋ฐ ๋ณ์๋ ๊ฐ์ด ๋ฐ๋์ด๋ Flutter๊ฐ ์์์ฑ์ง ๋ชปํด์, ํ๋ฉด์ ๋ณด์ด๋ ๊ฐ์
StatefulWidget์State์ ๋ณด๊ดํ๋ค StatefulWidget์ ๋ถ๋ณ์ธ ์์ ฏ์ด๊ณ , ๊ฐ์ ๊ณ์ ์ด์ ์๋State๊ฐ์ฒด๊ฐ ๋ค๊ณ ์๋ค- ๊ฐ์ ๋ฐ๊ฟ ๋๋
setState(() { ... })์์์ ๋ฐ๊ฟ์ผbuild๊ฐ ๋ค์ ์คํ๋์ด ํ๋ฉด์ด ๊ฐฑ์ ๋๋ค initState๋ ํ ๋ฒ๋ง,build๋setState๋ง๋ค,dispose๋ ์ ๊ฑฐ๋ ๋ ์คํ๋๋ฏ๋ก ์ด๊ธฐ ์ธํ ๊ณผ ์ ๋ฆฌ๋ ๊ฑฐ๊ธฐ์ ํ๋ค- ComposeยทSwiftUI๋ ์๋ ๊ฐฑ์ ์ด๊ณ Flutter๋
setState๋ฅผ ์ง์ ํธ์ถํ๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ค
๋ค์ ๊ธ์์๋ Row, Column, Stack, Expanded ๊ฐ์ ๋ ์ด์์ ์์ ฏ์ ๋ค๋ค๋ณด๊ฒ ๋ค.
