2025-09-17

ย  ํ”Œ๋Ÿฌํ„ฐ ์œ„์ ฏ๋“ค์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ๊ธฐ๋Šฅ๋“ค์„ ์•Œ์•„๋ณด์•˜๋‹ค.


Flutter ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

  • lib/
    • ์•ฑ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ Dart ์ฝ”๋“œ ์ž‘์„ฑ ์œ„์น˜. main.dart๊ฐ€ ์ง„์ž…์ 
  • pubspec.yaml
    • ํ”„๋กœ์ ํŠธ ์ •๋ณด ๊ธฐ๋ก
    • ํŒจํ‚ค์ง€ ์˜์กด์„ฑ ์ถ”๊ฐ€ (pub.dev ์‚ฌ์šฉ)
    • ์ด๋ฏธ์ง€, ํฐํŠธ ํŒŒ์ผ ์œ„์น˜ ์„ ์–ธ (/asset ๊ฒฝ๋กœ ๋“ฑ๋ก)
    • ํŒจํ‚ค์ง€ ์ถ”๊ฐ€ ์‹œ โ†’ ์ง์ ‘ ์ถ”๊ฐ€๋ณด๋‹ค๋Š” flutter pub add ํŒจํ‚ค์ง€๋ช… ๊ถŒ์žฅ
  • pubspec.lock
    • ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ฒ„์ „์„ ๊ณ ์ •ํ•˜์—ฌ ๊ธฐ๋ก
  • android, ios, โ€ฆ ๊ทธ ์™ธ ๋„ค์ดํ‹ฐ๋ธŒ ํด๋”๋“ค
    • ๋””๋ฐ”์ด์Šค ๊ถŒํ•œ ์„ค์ •
    • ์•ฑ ์ด๋ฆ„ ๋ฐ ์•„์ด์ฝ˜ ๊ด€๋ฆฌ
    • ๋„ค์ดํ‹ฐ๋ธŒ ๊ธฐ๋Šฅ ์ง์ ‘ ๊ฐœ๋ฐœ ์‹œ ํ™œ์šฉ


Flutter์˜ ์œ„์ ฏ

  • Flutter๋Š” ์œ„์ ฏ ํŠธ๋ฆฌ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•œ๋‹ค.
  • StatelessWidget : ์ƒํƒœ ์—†์Œ
  • StatefulWidget : ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ฐ€์ง. setState()๋ฅผ ํ†ตํ•ด UI ๊ฐฑ์‹ 

StatefulWidget

  • StatefulWidget์€ createState๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผํ•œ๋‹ค.
  • ์ƒํƒœ ํด๋ž˜์Šค(State<์œ„์ ฏ๋ช…>์„ ์ƒ์†๋ฐ›๋Š”)๋ฅผ ์ •์˜ํ•˜๊ณ  createState์—์„œ ์ด๊ฑธ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค.
class CounterWidget extends StatefulWidget {
  @override
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      	onTap: () {
	  count++;
	  setState((){});
	  },
          child: Text('$count'),
        );
  }
}

์ž‘์„ฑ TIP

  • ๊ทธ๋ƒฅ StatelessWidget์œผ๋กœ ์ฝ”๋“œ์ž‘์„ฑํ•˜๊ณ  ๐Ÿ’ก๋ฅผ ํ†ตํ•ด StatefulWidget์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š”๊ฒŒ ํŽธํ•˜๋‹ค!


์ฃผ์š” ์œ„์ ฏ

  • MaterialApp
    • ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์˜ ์ตœ์ƒ์œ„ ์œ„์ ฏ. ์•ฑ ์ „์ฒด์˜ ํ…Œ๋งˆ, ํŽ˜์ด์ง€ ๋ผ์šฐํŠธ, ํƒ€์ดํ‹€, ํ™ˆ, ํฐํŠธ์„ ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ต์‹ฌ ์ปจํ…Œ์ด๋„ˆ
  • Scaffold
    • ํ™”๋ฉด์˜ ๊ธฐ๋ณธ ๋ผˆ๋Œ€๊ฐ€ ๋˜๋Š” ์œ„์ ฏ
    • ํ™”๋ฉด ๋‹น ํ•˜๋‚˜์˜ Scaffold ๋ฅผ ๊ฐ–๋Š”๋‹ค
    • ์†์„ฑ : appBar, body, floatingActionButton, drawer, bottomNavigationBar ๋“ฑ
  • Column / Row
    • children, mainAxisAlignment, crossAxisAlignment
  • SingleChildScrollView
    • Column/Row๋ฅผ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ฐ์‹ธ๋Š” ์œ„์ ฏ. child๋กœ Column/Row๋ฅผ ๊ฐ–๋Š”๋‹ค
  • SizedBox
    • ์ž์‹ ์œ„์ ฏ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๊ณต๋ฐฑ ์ƒ์„ฑ ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
  • Container
    • SizedBox ๊ธฐ๋Šฅ + ๋ ˆ์ด์•„์›ƒ/์Šคํƒ€์ผ/์ •๋ ฌ
  • Expanded
    • Column/Row ๋‚ด๋ถ€์—์„œ ๋‚จ์€ ๊ณต๊ฐ„์„ ๋ชจ๋‘ ์ฐจ์ง€. flex๋กœ ๋น„์œจ ์ง€์ • ๊ฐ€๋Šฅ
  • Spacer
    • ์œ„์ ฏ ์‚ฌ์ด์— ๋‹จ์ˆœ ๊ณต๊ฐ„๋งŒ ์ถ”๊ฐ€
  • Stack
    • ์ž์‹ ์œ„์ ฏ์„ ๊ฒน์ณ ๋ฐฐ์น˜.
  • Positioned
    • ์œ„์ ฏ์˜ ์œ„์น˜ ์ง€์ • (top/bottom/left/right ๋งŒํผ ๋–จ์–ด์ง„ ๊ณต๊ฐ„์— ์ž์‹์„ ์ƒ์„ฑ)
  • width: double.infinity ์†์„ฑ
    • ๊ฐ€๋กœ ์ฑ„์šฐ๊ธฐํ•  ๋•Œ ์“ฐ์ธ๋‹ค


๋ฒ„ํŠผ ๋ฐ ์ œ์Šค์ฒ˜

  • ElevatedButton
    • Material ์Šคํƒ€์ผ ๊ธฐ๋ณธ ๋ฒ„ํŠผ
    • ๋ˆŒ๋ €์„ ๋•Œ ์‚ด์ง ํŠ€์–ด๋‚˜์˜ค๋Š” ํšจ๊ณผ
    • ๋ถ€๋ชจ ์œ„์ ฏ ํฌ๊ธฐ์— ๋”ฐ๋ผ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋จ (๋ถ€๋ชจ ์œ„์ ฏ ํฌ๊ธฐ๊ฐ€ ์—†๋‹ค๋ฉด ์ž๋…€์œ„์ ฏ ํฌ๊ธฐ๋ฅผ ๋”ฐ๋ผ ๊ฐ)
  • GestureDetector
    • ๋ชจ๋“  ์œ„์ ฏ์„ ํด๋ฆญ/ํ„ฐ์น˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ฆ. child๋กœ ์œ„์ ฏ์„ ๊ฐ–๋Š”๋‹ค
    • ์ฃผ์š” ์ด๋ฒคํŠธ : onTap, onDoubleTap, onLongPress


๋‹จ์ถ•ํ‚ค

  • Ctrl + . : ๋น ๋ฅธ ์•ก์…˜(์ž๋™ ์ƒ์„ฑ, ๋ž˜ํ•‘ ๋“ฑ)



ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: