๐Ÿ“ฑ ์•ฑ ๊ฐœ๋ฐœ ๐ŸŒฑ ์ž…๋ฌธ

Flutter ์ž…๋ฌธ

Dart์™€ Flutter๋กœ ํฌ๋กœ์Šคํ”Œ๋žซํผ ์•ฑ ๊ฐœ๋ฐœ

โฑ๏ธ 10์‹œ๊ฐ„ ๐Ÿ‘๏ธ 28 ์กฐํšŒ โญ ์ถ”์ฒœ ๊ฐ•์ขŒ
๐Ÿ“– ๊ฐ•์ขŒ ๋‚ด์šฉ
# Flutter ์ž…๋ฌธ ๊ฐ€์ด๋“œ

## ํ•™์Šต ๋ชฉํ‘œ
Flutter๋กœ iOS/Android ์•ฑ์„ ๋™์‹œ์— ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

## 1. Flutter๋ž€?
Google์ด ๋งŒ๋“  ํฌ๋กœ์Šคํ”Œ๋žซํผ UI ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
- ๋‹จ์ผ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ iOS/Android/Web
- ๋น ๋ฅธ ํ•ซ ๋ฆฌ๋กœ๋“œ
- ํ’๋ถ€ํ•œ ์œ„์ ฏ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
- ๋„ค์ดํ‹ฐ๋ธŒ ์„ฑ๋Šฅ

## 2. ์„ค์น˜
flutter.dev์—์„œ SDK ๋‹ค์šด๋กœ๋“œ
ํ™˜๊ฒฝ๋ณ€์ˆ˜ PATH์— flutter/bin ์ถ”๊ฐ€

flutter doctor
flutter create myapp
cd myapp
flutter run

## 3. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ
lib/main.dart - ์•ฑ ์‹œ์ž‘์ 
pubspec.yaml - ์˜์กด์„ฑ ๊ด€๋ฆฌ
android/ - Android ์„ค์ •
ios/ - iOS ์„ค์ •

## 4. ๊ธฐ๋ณธ ์•ฑ ๊ตฌ์กฐ
import "package:flutter/material.dart";

void main() {
runApp(MyApp());
}

class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("My App")),
body: Center(child: Text("Hello Flutter")),
),
);
}
}

## 5. StatelessWidget vs StatefulWidget
StatelessWidget - ์ƒํƒœ ์—†์Œ:
class Greeting extends StatelessWidget {
final String name;
Greeting({required this.name});

Widget build(BuildContext context) {
return Text("Hello, $name");
}
}

StatefulWidget - ์ƒํƒœ ์žˆ์Œ:
class Counter extends StatefulWidget {
_CounterState createState() => _CounterState();
}

class _CounterState extends State<Counter> {
int count = 0;

Widget build(BuildContext context) {
return Column(
children: [
Text("Count: $count"),
ElevatedButton(
onPressed: () => setState(() => count++),
child: Text("Add"),
),
],
);
}
}

## 6. ๊ธฐ๋ณธ ์œ„์ ฏ
๋ ˆ์ด์•„์›ƒ:
Container, Row, Column, Stack
Padding, Center, Expanded, Flexible
ListView, GridView

์ž…๋ ฅ:
Text, TextField, TextFormField
ElevatedButton, TextButton, IconButton
Checkbox, Switch, Radio, Slider

ํ‘œ์‹œ:
Image, Icon, CircularProgressIndicator
Card, ListTile, Chip

## 7. ๋ ˆ์ด์•„์›ƒ
Column (์„ธ๋กœ):
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [Text("A"), Text("B")],
)

Row (๊ฐ€๋กœ):
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [Icon(Icons.star), Text("Rating")],
)

Stack (๊ฒน์นจ):
Stack(
children: [
Image.network(url),
Positioned(bottom: 10, child: Text("Caption")),
],
)

## 8. ๋„ค๋น„๊ฒŒ์ด์…˜
๊ธฐ๋ณธ ์ด๋™:
Navigator.push(context, MaterialPageRoute(
builder: (context) => DetailPage(),
));

๋’ค๋กœ๊ฐ€๊ธฐ:
Navigator.pop(context);

Named Routes:
MaterialApp(
routes: {
"/": (context) => HomePage(),
"/detail": (context) => DetailPage(),
},
)
Navigator.pushNamed(context, "/detail");

## 9. HTTP ํ†ต์‹ 
pubspec.yaml์— http ์ถ”๊ฐ€:
dependencies:
http: ^1.1.0

import "package:http/http.dart" as http;
import "dart:convert";

Future<List<User>> fetchUsers() async {
final response = await http.get(Uri.parse("https://api.example.com/users"));
if (response.statusCode == 200) {
final List data = json.decode(response.body);
return data.map((e) => User.fromJson(e)).toList();
}
throw Exception("Failed to load");
}

## 10. ์ƒํƒœ ๊ด€๋ฆฌ
Provider:
dependencies:
provider: ^6.0.0

ChangeNotifierProvider(
create: (context) => CartModel(),
child: MyApp(),
)

Consumer<CartModel>(
builder: (context, cart, child) {
return Text("Items: ${cart.items.length}");
},
)

context.read<CartModel>().addItem(item);
context.watch<CartModel>().items;

## 11. ๋กœ์ปฌ ์ €์žฅ
SharedPreferences:
final prefs = await SharedPreferences.getInstance();
await prefs.setString("token", "abc123");
final token = prefs.getString("token");

SQLite (sqflite):
final db = await openDatabase("app.db");
await db.insert("users", {"name": "Kim"});
final users = await db.query("users");

## 12. ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ
Android APK:
flutter build apk --release

Android App Bundle:
flutter build appbundle

iOS:
flutter build ios --release

Web:
flutter build web

## ์ถ”์ฒœ ํ•™์Šต ์ˆœ์„œ
1. Dart ์–ธ์–ด ๊ธฐ์ดˆ
2. ๊ธฐ๋ณธ ์œ„์ ฏ ์ตํžˆ๊ธฐ
3. ๋ ˆ์ด์•„์›ƒ ๋งˆ์Šคํ„ฐ
4. ์ƒํƒœ ๊ด€๋ฆฌ ์ดํ•ด
5. API ์—ฐ๋™ ๋ฐ ๋ฐฐํฌ