๋ชจ๋ ๊ฒ์ ์์ ฏ - StatelessWidget๋ถํฐ ๋ง๋ค์ด๋ณด๊ธฐ
์ง๋ ๊ธ๊น์ง Dart ๋ฌธ๋ฒ์ ๋๋์ผ๋, ์ด์ Flutter ํ๋ฉด์ ๋ง๋ค ์ฐจ๋ก๋ค. Compose๋ SwiftUI์์๋ ํ๋ฉด์ ํจ์๋ ๊ตฌ์กฐ์ฒด๋ก ๊ทธ๋ฆฌ๋๋ฐ, Flutter๋ ํ๋ฉด์ ๋ณด์ด๋ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ์์ ฏ์ด๋ค. ๊ธ์๋ ์์ ฏ, ๋ฒํผ๋ ์์ ฏ, ์ฌ๋ฐฑ๊ณผ ๊ฐ์ด๋ฐ ์ ๋ ฌ๋ ์์ ฏ์ด๋ค.
Compose ํ๋ ์ต๊ด๋๋ก ํ๋ฉด์ ํ๋ ๋ง๋ค์ด๋ณด์. ํจ์ ํ๋์ Text๋ฅผ ๋ฃ์ผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
import 'package:flutter/material.dart';
void main() {
runApp(Greeting()); // ์ฌ๊ธฐ์ ์๋ฌ๋จ
}
Widget Greeting() {
return Text('์๋
ํ์ธ์');
}runApp(Greeting()) ์์ฒด๋ ๋์๊ฐ ์๋ ์๋๋ฐ, ์คํํ๋ฉด ํ๋ฉด์ด ๋นจ๊ฐ๊ฒ ๊นจ์ง๊ฑฐ๋ No Directionality widget found ๊ฐ์ ์๋ฌ๊ฐ ๋๋ค. Text๋ ๊ธ์๋ฅผ ๊ทธ๋ฆด ๋ "๊ธ์๋ฅผ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ธ์ง"(ํ
์คํธ ๋ฐฉํฅ), ํ
๋ง, ํ๋ฉด ํฌ๊ธฐ ๊ฐ์ ์ ๋ณด๊ฐ ํ์ํ๋ฐ, ๊ทธ๊ฑธ ์์์ ๋ด๋ ค์ฃผ๋ ์์ ฏ์ด ํ๋๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ธ: ์์ ฏ์ ํผ์ ์กด์ฌํ์ง ์๊ณ , ์์์ ์๋๋ก ์ด์ด์ง๋ "ํธ๋ฆฌ"๋ค
Flutter ํ๋ฉด์ ์์ ฏ์ด ๋ถ๋ชจ-์์์ผ๋ก ์ด์ด์ง ์์ ฏ ํธ๋ฆฌ๋ค. ์์ ์์ ฏ์ ๋ถ๋ชจ๊ฐ ๋ด๋ ค์ฃผ๋ ์ ๋ณด(๋ฐฉํฅ, ํ
๋ง, ํฌ๊ธฐ ์ ์ฝ)๋ฅผ ๋ฐ์์ ๊ทธ๋ ค์ง๋ค. ๋งจ ์์ ๊ทธ ์ ๋ณด๋ฅผ ๋ด๋ ค์ฃผ๋ ์์ ฏ์ด ์์ผ๋ฉด Text๊ฐ ๊ทธ๋ฆด ๋ฐฉ๋ฒ์ด ์๋ค.
๊ทธ ์ญํ ์ ํ๋ ๊ฒ MaterialApp๊ณผ Scaffold๋ค.
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Scaffold(
body: Center(
child: Text('์๋
ํ์ธ์'),
),
),
);
}
}ํ๋ฉด ๊ฐ์ด๋ฐ์ "์๋ ํ์ธ์"๊ฐ ๋ฌ๋ค. ์ฌ๊ธฐ์ ์์ ฏ ํธ๋ฆฌ๋ ์ด๋ ๊ฒ ์ด์ด์ ธ ์๋ค.
MyApp
โ MaterialApp โ ํ
๋ง, ๋ฐฉํฅ, ๋ผ์ฐํ
์ ๋ณด๋ฅผ ์๋๋ก ๋ด๋ ค์ค
โ Scaffold โ ์ฑ๋ฐ, ๋ณธ๋ฌธ, ๋ฒํผ ๊ฐ์ ํ๋ฉด ๋ผ๋
โ Center โ ์์์ ๊ฐ์ด๋ฐ์ ๋์
โ Text โ ์ค์ ๊ธ์Center๋ ์์ ฏ์ด๋ผ๋ ์ ์ด ์ค์ํ๋ค. "๊ฐ์ด๋ฐ ์ ๋ ฌ"์ด ์์ฑ์ด ์๋๋ผ ๊ฐ์ด๋ฐ ์ ๋ ฌ์ ํด์ฃผ๋ ์์ ฏ์ผ๋ก ๊ฐ์ธ๋ ๊ฒ์ด๋ค. Compose์ Modifier.align์ด๋ SwiftUI์ .frame(alignment๊ณผ ๋ฐ์์ด ๋ค๋ฅด๋ค.
์์ ฏ์ ๋ง๋๋ ๋ฐฉ๋ฒ: StatelessWidget
MyApp์ฒ๋ผ StatelessWidget์ ์์ํด์ build ๋ฉ์๋์์ ์์ ฏ ํธ๋ฆฌ๋ฅผ ๋๋ ค์ฃผ๋ ๊ฒ ๊ฐ์ฅ ๊ธฐ๋ณธ ํํ๋ค.
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(...);
}
}์์ ๊ธ๋ค์์ ๋ฐฐ์ด ๋ฌธ๋ฒ์ด ๊ทธ๋๋ก ๋ค์ด ์๋ค.
extends StatelessWidgetโ ์์ ๊ธ์์ ๋ณธextends, ๋ถ๋ชจ๋ ํ๋const MyApp({super.key})โ ์์ฑ์ ๊ธ์์ ๋ณธ ํํ,super.key๋ ๋ถ๋ชจ ์์ฑ์๋กkey๋ฅผ ๋๊ธฐ๋ ์ค์ ๋ฌธ๋ฒ@overrideโ ๋ถ๋ชจ์build๋ฅผ ์ฌ์ ์build๊ฐ ๋๋ ค์ฃผ๋ ๊ฒ โ ์์ ฏ ํธ๋ฆฌ
const๋ฅผ ๋ถ์ด๋ ์ด์ ๋ final/const ๊ธ์์ ๋งํ ๋๋ก "์ปดํ์ผ ๋ ๊ณ ์ ๋๋ ๊ฐ์ด๋ฉด Flutter๊ฐ ๋ค์ ๋ง๋ค์ง ์๊ณ ์ฌ์ฌ์ฉํ ์ ์๊ฒ" ์๋ ค์ฃผ๋ ํํธ๋ค.
BuildContext๋ ๋ญ๊ฐ
build(BuildContext context)์ context๋ "์ด ์์ ฏ์ด ํธ๋ฆฌ์ ์ด๋ ์์น์ ์๋์ง"๋ฅผ ๊ฐ๋ฆฌํค๋ ์ ๋ณด๋ค. ์๋ก ์ฌ๋ผ๊ฐ๋ฉด์ ๋ถ๋ชจ๊ฐ ๋ด๋ ค์ค ์ ๋ณด๋ฅผ ์ฐพ๋ ๋ฐ ์ด๋ค.
@override
Widget build(BuildContext context) {
final color = Theme.of(context).colorScheme.primary; // ์์ชฝ MaterialApp์ ํ
๋ง๋ฅผ ์ฐพ์
return Text('์๋
ํ์ธ์', style: TextStyle(color: color));
}Theme.of(context)๋ "๋ด ์์น์์ ์๋ก ์ฌ๋ผ๊ฐ๋ฉฐ ๊ฐ์ฅ ๊ฐ๊น์ด ํ
๋ง๋ฅผ ์ฐพ์์๋ผ"๋ ๋ป์ด๋ค. ์๊น MaterialApp์ด ํ
๋ง๋ฅผ ๋ด๋ ค์ค๋ค๊ณ ํ ๊ฒ๊ณผ ์ด์ด์ง๋ค. ์ง๊ธ์ context๋ฅผ "ํธ๋ฆฌ์์์ ๋ด ์ฃผ์" ์ ๋๋ก๋ง ์์๋๋ฉด ๋๋ค.
Stateless๋ผ๋ ์ด๋ฆ์ ๋ป
StatelessWidget์ ์ํ(๋ฐ๋๋ ๊ฐ)๊ฐ ์๋ ์์ ฏ์ด๋ค. ๋ฐ์ ๊ฐ์ผ๋ก ํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ๋ง ํ๊ณ , ์ค์ค๋ก ๊ฐ์ ๋ฐ๊พธ์ง ์๋๋ค.
class UserCard extends StatelessWidget {
final String name;
const UserCard({super.key, required this.name});
@override
Widget build(BuildContext context) {
return Text('์ด๋ฆ: $name');
}
}
// ์ฌ์ฉ
const UserCard(name: 'ํ๊ธธ๋')name์ด final์ธ ์ด์ ๊ฐ ์ฌ๊ธฐ ์๋ค. ์์ ฏ์ ๋ถ๋ณ ๊ฐ์ฒด์ด๊ณ , ๊ฐ์ด ๋ฐ๋๋ฉด ์์ ฏ์ ๊ณ ์น๋ ๊ฒ ์๋๋ผ ์ ์์ ฏ์ ๋ง๋ ๋ค. ๋ฒํผ์ ๋๋ฌ์ ์ซ์๊ฐ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ฒ๋ผ ๊ฐ์ด ๋ฐ๋๋ ํ๋ฉด์ ๋ค์ ๊ธ์์ ๋ค๋ฃฐ StatefulWidget์ ์ด๋ค.
Compose, SwiftUI์ ๋น๊ตํ๋ฉด
// Compose
@Composable
fun UserCard(name: String) {
Text("์ด๋ฆ: $name")
}// SwiftUI
struct UserCard: View {
let name: String
var body: some View {
Text("์ด๋ฆ: \(name)")
}
}Flutter | Compose | SwiftUI | |
ํ๋ฉด ๋จ์ | ํด๋์ค ( | ํจ์ ( | ๊ตฌ์กฐ์ฒด ( |
๊ทธ๋ฆฌ๋ ๊ณณ |
| ํจ์ ๋ชธํต์ด ๋ฐ๋ก ๊ทธ๋ฆผ |
|
์ ๋ ฅ๊ฐ | ์์ฑ์ + | ํจ์ ํ๋ผ๋ฏธํฐ |
|
๊ฐ์ด๋ฐ ์ ๋ ฌ |
|
|
|
SwiftUI์ ๊ตฌ์กฐ๊ฐ ์ ์ผ ๋น์ทํ๋ค. struct ... : View์ body๊ฐ ์๋ ๊ฒ์ฒ๋ผ Flutter๋ class ... extends StatelessWidget์ build๊ฐ ์๋ค. Compose๋ง ํจ์๋ผ์ ๋ชจ์์ด ๋ค๋ฅด๋ค.
์ ๋ฆฌ
- Flutter ํ๋ฉด์ ์์ ฏ์ด ๋ถ๋ชจ-์์์ผ๋ก ์ด์ด์ง ํธ๋ฆฌ์ด๊ณ , ๊ธ์ยท๋ฒํผยท๊ฐ์ด๋ฐ ์ ๋ ฌ๊น์ง ์ ๋ถ ์์ ฏ์ด๋ค
- ์ฑ์ ๋งจ ์์๋
MaterialApp๊ณผScaffold๊ฐ ํ ๋ง์ ํ๋ฉด ๋ผ๋๋ฅผ ๋ด๋ ค์ค์ผText๊ฐ์ ์์ ฏ์ด ์ ๋๋ก ๊ทธ๋ ค์ง๋ค StatelessWidget์ ์์ํ๊ณbuild์์ ์์ ฏ ํธ๋ฆฌ๋ฅผ ๋๋ ค์ฃผ๋ ๊ฒ ๊ฐ์ฅ ๊ธฐ๋ณธ ํํ๋คBuildContext๋ ํธ๋ฆฌ์์ ๋ด ์์น๋ฅผ ๊ฐ๋ฆฌํค๊ณ ,Theme.of(context)์ฒ๋ผ ์์ชฝ ์ ๋ณด๋ฅผ ์ฐพ๋ ๋ฐ ์ด๋ค- ์์ ฏ์ ๋ถ๋ณ์ด๋ผ ํ๋๋
final์ด๊ณ , ๊ฐ์ด ๋ฐ๋๋ ํ๋ฉด์StatefulWidget์ผ๋ก ๋ง๋ ๋ค
๋ค์ ๊ธ์์๋ StatefulWidget๊ณผ setState๋ฅผ ๋ค๋ค๋ณด๊ฒ ๋ค.
