C:\src\flutter / C:\dev\flutterFlutter 설치/업데이트에 Git이 필요
https://docs.flutter.dev/get-started/quick
https://git-scm.com/install/windows

git --version

https://docs.flutter.dev/tools/vs-code


Ctrl + Shift + P → Flutter: New Project https://docs.flutter.dev/install/with-vs-code
🚨 나의 경우 Flutter SDK 설치 안내가 안뜸4-1-1) VS Code 터미널에서 Flutter가 있는지 즉시 확인
VS Code에서
Terminal > New Terminal(PowerShell) 열고 아래 실행:where flutter flutter --version
where flutter가 아무것도 안 나옴 /flutter인식 불가→ Flutter SDK가 아직 없거나 PATH가 안 잡힘
4-1-2) Flutter SDK를 수동으로 설치
https://docs.flutter.dev/install/manual
4-1-2-a) 폴더 만들기
- Flutter Windows SDK(zip) 받아서
C:\src\에 풀면C:\src\flutter폴더 생기게 함
C:\src\만들고 그 안에 Flutter를 설치
- 최종:C:\src\flutter4-1-2-b) Flutter SDK 다운로드 & 압축 해제
4-1-2-c) PATH 추가
환경 변수 Path에 아래를 추가:
C:\src\flutter\bin
VS Code/PowerShell을 전부 닫고 다시 열기
- PATH 적용을 위해 필요https://docs.flutter.dev/install/add-to-path
4-1-2-d) 다시 확인
where.exe flutter flutter --version dart --version
Ctrl + Shift + P → Flutter: New Project


flutter --version
dart --version

flutter doctor -v

https://docs.flutter.dev/platform-integration/android/setup
https://developer.android.com/studio?hl=ko

아래 항목이 선택되어 있어야 함:

Not installed / Update available면 체크하고 Apply → OK → Finish
flutter doctor --android-licenses
모두 동의하면 All SDK package licenses accepted.


https://developer.android.com/studio/run/emulator-acceleration?utm_source=chatgpt.com&hl=ko
https://learn.microsoft.com/en-us/windows/android/emulator?utm_source=chatgpt.com
https://docs.flutter.dev/platform-integration/android/setup
+ Create Virtual Device

flutter devices

https://docs.flutter.dev/platform-integration/windows/setup
flutter doctor -v
Ctrl + Shift + PFlutter: New Projectlib/main.dart를 아래 코드로 전체 교체import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const SetupVerifiedApp());
}
class SetupVerifiedApp extends StatefulWidget {
const SetupVerifiedApp({super.key});
State<SetupVerifiedApp> createState() => _SetupVerifiedAppState();
}
class _SetupVerifiedAppState extends State<SetupVerifiedApp> {
ThemeMode _themeMode = ThemeMode.system;
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Setup Verified',
debugShowCheckedModeBanner: false,
themeMode: _themeMode,
theme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
),
darkTheme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.blue,
brightness: Brightness.dark,
),
),
home: HomeScreen(
themeMode: _themeMode,
onChangeThemeMode: (mode) => setState(() => _themeMode = mode),
),
);
}
}
class HomeScreen extends StatefulWidget {
const HomeScreen({
super.key,
required this.themeMode,
required this.onChangeThemeMode,
});
final ThemeMode themeMode;
final ValueChanged<ThemeMode> onChangeThemeMode;
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
int _count = 0;
DateTime _now = DateTime.now();
void _tick() => setState(() => _now = DateTime.now());
Widget build(BuildContext context) {
final platform = defaultTargetPlatform.toString();
final brightness = Theme.of(context).brightness.toString();
return Scaffold(
appBar: AppBar(
title: const Text('Flutter Setup Verified ✅'),
actions: [
PopupMenuButton<ThemeMode>(
tooltip: 'Theme',
initialValue: widget.themeMode,
onSelected: widget.onChangeThemeMode,
itemBuilder: (context) => const [
PopupMenuItem(value: ThemeMode.system, child: Text('System')),
PopupMenuItem(value: ThemeMode.light, child: Text('Light')),
PopupMenuItem(value: ThemeMode.dark, child: Text('Dark')),
],
child: const Padding(
padding: EdgeInsets.symmetric(horizontal: 16),
child: Icon(Icons.palette_outlined),
),
),
],
),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
_InfoCard(
title: '환경 정보',
children: [
_InfoRow(label: 'Platform', value: platform),
_InfoRow(label: 'Build Mode', value: kDebugMode ? 'debug' : 'release/profile'),
_InfoRow(label: 'Brightness', value: brightness),
],
),
const SizedBox(height: 12),
_InfoCard(
title: '실행 확인(상태 변경)',
children: [
_InfoRow(label: 'Counter', value: '$_count'),
const SizedBox(height: 8),
FilledButton.icon(
onPressed: () => setState(() => _count++),
icon: const Icon(Icons.add),
label: const Text('카운터 +1'),
),
],
),
const SizedBox(height: 12),
_InfoCard(
title: '실시간/리빌드 확인',
children: [
_InfoRow(label: 'Now', value: _now.toString()),
const SizedBox(height: 8),
OutlinedButton.icon(
onPressed: _tick,
icon: const Icon(Icons.refresh),
label: const Text('시간 새로고침'),
),
const SizedBox(height: 8),
const Text(
'팁) VS Code에서 실행 중에 코드를 조금 수정하고 저장하면 Hot Reload로 바로 반영돼야 해요.',
),
],
),
],
),
);
}
}
class _InfoCard extends StatelessWidget {
const _InfoCard({required this.title, required this.children});
final String title;
final List<Widget> children;
Widget build(BuildContext context) {
return Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(title, style: Theme.of(context).textTheme.titleMedium),
const SizedBox(height: 12),
...children,
],
),
),
);
}
}
class _InfoRow extends StatelessWidget {
const _InfoRow({required this.label, required this.value});
final String label;
final String value;
Widget build(BuildContext context) {
return Row(
children: [
SizedBox(
width: 110,
child: Text(
label,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.w600,
),
),
),
Expanded(child: Text(value)),
],
);
}
}
flutter devices
flutter run -d emulator-5554 #5554 부분은 에뮬레이터 위에 뜨는 번호로 작성
