-
ํ์ด๋จธ ๊ฐ๋ฐ์ผ๊ธฐ 1์นดํ ๊ณ ๋ฆฌ ์์ 2025. 3. 11. 21:10
๐ ์ค๋์ Flutter ๊ฐ๋ฐ ๊ธฐ๋ก (ํ์ด๋จธ ์ฑ ๋ง๋ค๊ธฐ)
๐ 2025๋ 3์ 11์ผ
๐ฏ ๋ชฉํ: Flutter๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ค ํ์ด๋จธ ์ฑ์ ๋ง๋ค๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ข์ ๊ตฌ์กฐ๋ก ๊ฐ์
โ ์ค๋ ํ ์ผ ์์ฝ
1. Flutter ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
- VS Code์์ Flutter ์ค์น ๋ฐ ์ค์
- iOS & Android ์๋ฎฌ๋ ์ดํฐ ์คํ ๋ฌธ์ ํด๊ฒฐ (flutter doctor)
- iOS ์๋ฎฌ๋ ์ดํฐ ์คํ ์ค๋ฅ ํด๊ฒฐ (open -a Simulator)
- Flutter ํ๋ก์ ํธ ์์ฑ (flutter create timer_app)
- Flutter ์ฑ ์ฒซ ์คํ (flutter run)
2. ํ์ด๋จธ ์ฑ ๊ธฐ๋ณธ UI ๊ตฌํ
- ํ์ด๋จธ ๋ชฉ๋ก์ ํ์ํ๋ ListView ์์ฑ
- + ๋ฒํผ์ ๋๋ฌ ํ์ด๋จธ ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ (์ด๋ฆ & ์๊ฐ ์ ๋ ฅ ๊ฐ๋ฅ)
- AlertDialog๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด๋จธ ์ถ๊ฐํ๋ UI ์์ฑ
3. ํ์ด๋จธ ๋์ ๊ธฐ๋ฅ ์ถ๊ฐ
- Timer.periodic์ ์ฌ์ฉํ์ฌ ์๊ฐ์ด ์ค์ด๋ค๋๋ก ๊ตฌํ
- play/pause ๋ฒํผ ์ถ๊ฐ → ํ์ด๋จธ ์์ & ์ผ์์ ์ง ๊ฐ๋ฅ
- ์๊ฐ์ด 0์ด ๋๋ฉด ์๋์ผ๋ก ์ ์ง
4. ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ฝ๋ ๋ฆฌํฉํ ๋ง
- main.dart ํ ํ์ผ์ ๋ชจ๋ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ณ , ํ์ผ & ํด๋ ๋ถ๋ฆฌ
- ๊ฐ์ฒด์งํฅ์ ์ค๊ณ๋ฅผ ์ ์ฉํ์ฌ ์ ์ง๋ณด์ ์ฉ์ดํ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝ
๐ ํด๋ ๊ตฌ์กฐ ์ ๋ฆฌ:
lib/ โโโ main.dart # ์ฑ์ ์ง์ ์ โโโ screens/ # ํ๋ฉด (UI ๊ด๋ จ) โ โโโ home_screen.dart # ํ์ด๋จธ ๋ฉ์ธ ํ๋ฉด โโโ models/ # ๋ฐ์ดํฐ ๋ชจ๋ธ โ โโโ timer_model.dart # ํ์ด๋จธ ๋ชจ๋ธ ํด๋์ค โโโ widgets/ # ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์์ ฏ โ โโโ timer_tile.dart # ํ์ด๋จธ ๋ฆฌ์คํธ ํญ๋ชฉ UI
โ ์ค๋ ์ด๋ ค์ ๋ ๋ถ๋ถ & ํด๊ฒฐ ๋ฐฉ๋ฒ
1๏ธโฃ flutter doctor์์ iOS ์๋ฎฌ๋ ์ดํฐ๊ฐ ์ ๋ณด์ด๋ ๋ฌธ์
๐น ๋ฌธ์ :
- flutter devices ์คํ ์ iPhone์ด ๋ชฉ๋ก์ ๋ํ๋์ง ์์
- flutter run -d iOS ์คํ ๋ถ๊ฐ
๐น ํด๊ฒฐ ๋ฐฉ๋ฒ:
- open -a Simulator๋ก iOS ์๋ฎฌ๋ ์ดํฐ ์ง์ ์คํ
- xcode-select --switch /Applications/Xcode.app/Contents/Developer๋ก Xcode ์ค์ ์ฌ์ ์ฉ
- flutter doctor ์คํํ์ฌ ์ค๋ฅ๊ฐ ํด๊ฒฐ๋๋์ง ํ์ธ
โ ๊ฒฐ๊ณผ: iOS ์๋ฎฌ๋ ์ดํฐ ์ ์ ์ธ์ ๋ฐ ์คํ ์ฑ๊ณต ๐
2๏ธโฃ List<String> vs List<Map<String, dynamic>> ํ์ ์ค๋ฅ ๋ฐ์
๐น ๋ฌธ์ :
type 'List<String>' is not a subtype of type 'List<Map<String, dynamic>>'- ๊ธฐ์กด์ List<String>์ผ๋ก ์ ์ธ๋ ๋ณ์๋ฅผ List<Map<String, dynamic>>์ผ๋ก ๋ณ๊ฒฝํ๋ฉด์ ๋ฐ์ํ ํ์ ์ค๋ฅ
๐น ํด๊ฒฐ ๋ฐฉ๋ฒ:
- List<Map<String, dynamic>>์ ๋ช ํํ ์ ์ธํ๊ณ , flutter clean์ผ๋ก ์บ์ ์ ๋ฆฌ ํ ๋ค์ ์คํ
- timers.add({'name': ..., 'time': ..., 'isRunning': false}) → ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ช ํํ ๋ณ๊ฒฝ
โ ๊ฒฐ๊ณผ: ํ์ ์ค๋ฅ ํด๊ฒฐ ๋ฐ ์ ์ ์คํ ๐
3๏ธโฃ type 'Null' is not a subtype of type 'bool' ์ค๋ฅ ๋ฐ์
๐น ๋ฌธ์ :
type 'Null' is not a subtype of type 'bool'- isRunning ๊ฐ์ ๋ช ํํ ์ด๊ธฐํํ์ง ์์์ ๋ฐ์
๐น ํด๊ฒฐ ๋ฐฉ๋ฒ:
timers.add({ 'name': nameController.text, 'time': int.tryParse(timeController.text) ?? 0, 'isRunning': false, // โ ๋ช ํํ ์ด๊ธฐํ ์ถ๊ฐ });โ ๊ฒฐ๊ณผ: ๋ ์ด์ null ๊ด๋ จ ์ค๋ฅ ์์ด ์ ์ ์คํ ๐
๐ฅ ์ค๋์ ์ฑ๊ณผ
โ Flutter ํ๊ฒฝ ์ค์ ์๋ฃ & ์ฑ ์คํ ๊ฐ๋ฅ
โ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ํ์ผ & ํด๋ ๊ตฌ์กฐ ๋ถ๋ฆฌ ์๋ฃ
โ ๋ค์ค ํ์ด๋จธ ์ถ๊ฐ + ์์/์ผ์์ ์ง ๊ธฐ๋ฅ ๊ตฌํ
โ iOS & Android์์ ์ ์ ์คํ ํ์ธ (flutter run)
โ ๋๋ฒ๊น & ์ค๋ฅ ํด๊ฒฐ ๋ฅ๋ ฅ ํฅ์
๐ ๋ค์ ๋ชฉํ
๐น ํ์ด๋จธ ์ญ์ ๊ธฐ๋ฅ ์ถ๊ฐ
๐น ํ์ด๋จธ ์๋ฃ ์ ์๋ฆผ ๊ธฐ๋ฅ ์ถ๊ฐ
๐น UI ๋์์ธ ๊ฐ์ (๋ ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค ์ ์ฉ)
๐น ์ฆ๊ฒจ์ฐพ๊ธฐ ๊ธฐ๋ฅ ๊ณ ๋ คํ์ฌ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ์ ๊ณ ๋ฏผ