[25.06.19 TIL] μœ„μ ―

κΉ€μ˜λ―ΌΒ·2025λ…„ 6μ›” 19일

[Flutter 7κΈ°] μ˜¨λ³΄λ”©

λͺ©λ‘ 보기
4/5

🎯 μ˜€λŠ˜μ€ λΆ€μ‘±ν•œ μœ„μ ― λΆ€λΆ„ κ°•μ˜λ₯Ό λ³΅μŠ΅ν•˜κ³ , ν—·κ°ˆλ¦¬κ±°λ‚˜ μ•Œμ§€ λͺ»ν•˜λŠ” μ½”λ“œλž‘ μœ„μ ―μ„ μ°Ύμ•„λ΄€λ‹€. velog에 μ •λ¦¬ν–ˆλ˜ λ‚΄μš©λ„ λ‹€μ‹œ ν™•μΈν•΄λ³΄λ©΄μ„œ μ§„ν–‰ν–ˆκ³ , 내일할 ν•™μŠ΅ κ³„νšλ„ κ°„λ‹¨ν•˜κ²Œ μ„Έμ› λ‹€.

그리고 μ˜€ν›„μ— Git에 기본에 λŒ€ν•œ νŠΉκ°•μ΄ μžˆμ–΄ λ“€μ—ˆλŠ”λ°, μ˜ˆμ „μ— ν•œλ²ˆ μ„€μΉ˜ν•˜κ³  μ¨λ΄€λŠ”λ° 기얡이 잘 μ•ˆλ‚˜μ„œ μ•½κ°„ μ–΄λ €μ› λ˜ 것 κ°™λ‹€.


πŸ“‹ μœ„μ ― 볡슡

1. View μœ„μ ―
Β Β 1-1 PageView μœ„μ ―
Β Β 1-2 ListView μœ„μ ―
Β Β 1-3 GridView μœ„μ ―
Β Β 1-4 TabBar μœ„μ ―


2. Layout μœ„μ ―
Β Β 2-1 Container μœ„μ ―
Β Β 2-2 SizedBox μœ„μ ―
Β Β 2-3 Row & Column μœ„μ ―
Β Β 2-4 Expanded μœ„μ ―
Β Β 2-5 Stack μœ„μ ― & Positioned μœ„μ ―


πŸŽ“ 개인 ν•™μŠ΅


πŸ”₯ Expanded

βœ… 예제

Row(
  children: [
    Expanded(
      child: Container(color: Colors.red, height: 100),
    ),
    Expanded(
      child: Container(color: Colors.green, height: 100),
    ),
  ],
)

βœ” Flex 계열 μœ„μ ―(Row, Column λ“±)의 child 쀑 ν•˜λ‚˜λ‘œ μ‚¬μš©λ˜μ–΄ 남은 곡간을 μ°¨μ§€ν•˜κ³ , flex 값을 톡해 λΉ„μœ¨ 쑰절이 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.


ν•­λͺ©ExpandedFlexible
남은 곡간무쑰건 꽉 μ±„μ›€ν•„μš”ν•œ 만큼만 채움
μžμ‹ μ œν•œμžμ‹μ΄ 꽉 μ°¨μ•Ό ν•¨μžμ‹ 크기에 따라 μœ μ—°ν•˜κ²Œ μ‘°μ • κ°€λŠ₯
κΈ°λ³Έ flex11

πŸ”₯ Children, Child

ν•­λͺ©childchildren
νƒ€μž…λ‹¨μΌ μœ„μ ― (Widget)μœ„μ ― 리슀트 (List<Widget>)
λœ»ν•˜λ‚˜μ˜ μžμ‹ μœ„μ ―μ—¬λŸ¬ 개의 μžμ‹ μœ„μ ―λ“€
μ‚¬μš©μ²˜Container, Center, Expanded λ“±Row, Column, Stack λ“±

βœ… child – ν•˜λ‚˜μ˜ μžμ‹λ§Œ 받을 수 μžˆμ„ λ•Œ

Center(
  child: Text('Hello, Flutter!'),
)

βœ” 보톡 단일 λ ˆμ΄μ•„μ›ƒμΌ λ•Œ μ‚¬μš©λ˜λŠ”λ°, CenterλŠ” μžμ‹μ΄ ν•˜λ‚˜λ§Œ λ“€μ–΄κ°ˆ 수 μžˆμ–΄μ„œ child 속성을 μ“΄λ‹€.


βœ… children – μ—¬λŸ¬ μžμ‹μ„ ν•œκΊΌλ²ˆμ— 넣을 λ•Œ

Column(
  children: [
    Text('Hello'),
    Text('Flutter'),
    Icon(Icons.star),
  ],
)

βœ” Column은 μ—¬λŸ¬ μžμ‹μ„ μ„Έλ‘œλ‘œ λ°°μΉ˜ν•˜λ‹ˆκΉŒ children을 μ¨μ•Όν•˜λ©°, 리슀트둜 μ—¬λŸ¬ μœ„μ ―μ„ ν•œ λ²ˆμ— λ„£μ–΄μ€˜μ•Ό ν•΄μ„œ List<Widget> ν˜•νƒœμ΄λ‹€.


✏️ List<Widget>

children: <Widget>[
   Widget(), 
   Widget(),
   ...
] // μ›λž˜ 전체 문법

βœ” Dart λ¬Έλ²•μ—μ„œ [ ]λŠ” 리슀트λ₯Ό λœ»ν•˜λŠ”λ°, children이 List<Widget> νƒ€μž…μ„ μš”κ΅¬ν•  λ•Œ κ·Έλ ‡κ²Œ 쓰인닀.
Β 
πŸ’‘ Dart νŠΉμ„±μƒ List에 Widget λ“€μ–΄κ°€ 있으면 μ•Œμ•„μ„œ List<Widget> 으둜 받아듀이기에 `` 을 μƒλž΅ν•  수 μžˆλ‹€.


μœ„μ ― μ’…λ₯˜child μ‚¬μš©children μ‚¬μš©
Containerβœ… μ‚¬μš© κ°€λŠ₯❌ μ‚¬μš© λΆˆκ°€
Centerβœ… μ‚¬μš© κ°€λŠ₯❌ μ‚¬μš© λΆˆκ°€
Expandedβœ… μ‚¬μš© κ°€λŠ₯❌ μ‚¬μš© λΆˆκ°€
Row❌ μ‚¬μš© λΆˆκ°€βœ… μ—¬λŸ¬ μžμ‹ ν•„μš”
Column❌ μ‚¬μš© λΆˆκ°€βœ… μ—¬λŸ¬ μžμ‹ ν•„μš”
Stack❌ μ‚¬μš© λΆˆκ°€βœ… μ—¬λŸ¬ μžμ‹ ν•„μš”

πŸ’‘ μ—λŸ¬ λ©”μ‹œμ§€μ— expected a Widget but got list<widget>이 λ‚˜μ˜€λ©΄,
childλ₯Ό 써야 ν•˜λŠ”λ° children을 μΌκ±°λ‚˜ λ°˜λŒ€λ‘œ 썼을 κ°€λŠ₯성이 크닀.


πŸ”₯ const

✏️ const

❗ 였λ₯˜ ν•΄κ²°


Widget build(BuildContext context) {
  return const MaterialApp(

"였λ₯˜ λ°œμƒ μ‹œ 보톡 constλ₯Ό μ§€μš°λ©΄ 였λ₯˜κ°€ ν•΄κ²°λœλ‹€"κ³  λ°°μ› λŠ”λ°, κ·Έ μ΄μœ κ°€ 뭘까?


이유 1. ❌ 내뢀에 const λΆˆκ°€λŠ₯ν•œ 속성이 μžˆμ„ λ•Œ

const MaterialApp(
  title: 'My App',
  home: MyHomePage(), // ❌ 이게 문제일 수 있음
)

MyHomePage()κ°€ constκ°€ μ•„λ‹Œλ°, 전체 MaterialApp을 const둜 λ§Œλ“€μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

 ❗ μ—λŸ¬: "The constructor being called isn't a const constructor."
βœ… ν•΄κ²°: constλ₯Ό μ§€μš°λ©΄ home이 constκ°€ μ•„λ‹ˆμ–΄λ„ OK!


이유 2. ❌ const둜 μ„ μ–Έν–ˆλŠ”λ° λ°”λ€ŒλŠ” 값을 λ„£μ—ˆμ„ λ•Œ

const MaterialApp(
  theme: ThemeData(primarySwatch: Colors.blue), // 이게 const μ•„λ‹˜
)

ThemeData(...)도 기본적으둜 constκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—, const둜 λ§Œλ“€λ©΄ μ—λŸ¬κ°€ λ‚œλ‹€.

βœ… ν•΄κ²°: constλ₯Ό μ§€μš°λ©΄ themeκ°€ constκ°€ μ•„λ‹ˆμ–΄λ„ OK!


상황섀λͺ…
constλ₯Ό 쓰면내뢀에 μžˆλŠ” λͺ¨λ“  값도 const
λ‚΄λΆ€ 값이 constκ°€ μ•„λ‹ˆλ©΄βŒ μ—λŸ¬ λ°œμƒ
constλ₯Ό μ§€μš°λ©΄λ‚΄λΆ€ μœ„μ ―μ΄ 변해도 λ˜λ‹ˆκΉŒ μ—λŸ¬ μ—†μŒ

🎯 μ–Έμ œ constλ₯Ό 써야 ν• κΉŒ?
κ°’μ΄λ‚˜ UIκ°€ 고정일 λ•Œ, λ³€ν•˜μ§€ μ•ŠλŠ” μœ„μ ―μΌ λ•Œ constλ₯Ό μ“°λ©΄ μ„±λŠ₯에 μ’‹λ‹€.

const Text('κ³ μ • ν…μŠ€νŠΈ') // πŸ‘
Text(DateTime.now().toString()) // ❌ const λͺ» 씀

✏️ constructor

μš©μ–΄μ˜λ―Έ
constλ³€ν•˜μ§€ μ•ŠλŠ” 객체λ₯Ό 생성할 λ•Œ μ‚¬μš©ν•˜λŠ” ν‚€μ›Œλ“œ
const constructorκ·Έ 객체λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μƒμ„±μž ν•¨μˆ˜κ°€ const둜 μ„ μ–Έλœ 경우

--
1️⃣ const constructor μ •μ˜

class MyBox extends StatelessWidget {
  const MyBox({super.key}); // const constructor
//
  
  Widget build(BuildContext context) {
    return Container(color: Colors.blue, width: 100, height: 100);
  }
}

2️⃣ const둜 객체 생성

const MyBox() // const constructor둜 const μ‚¬μš© κ°€λŠ₯!

❌ constλ₯Ό μ“°λ €λ©΄ ν΄λž˜μŠ€μ— const constructorκ°€ μ •μ˜λ˜μ–΄μ•Όν•˜λ©°, κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ MyWidget() μ΄λ ‡κ²Œ 써야 ν•˜κ³ , μ΅œμ ν™”λŠ” μ•ˆλœλ‹€.


✏️ factory constructor

  • const constructor - λΆˆλ³€ 객체 λ§Œλ“€ 수 μžˆλŠ” 일반 μƒμ„±μž
  • factory constructor - 객체λ₯Ό λ§Œλ“€ λ•Œ 직접 μƒμ„±ν•˜μ§€ μ•Šκ³ , 쑰건에 따라 κΈ°μ‘΄ κ±Έ μž¬μ‚¬μš©ν•˜κ±°λ‚˜ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ μƒμ„±ν•˜λŠ” μƒμ„±μž
  • κ·Έκ±Έ const둜 λ§Œλ“€λ©΄? πŸ‘‰ const factory constructor

βœ… 보톡 const μƒμ„±μžλŠ” λ‹¨μˆœν•˜κ²Œ 객체만 λ§Œλ“€κ³  끝인데, factoryλŠ” 같은 값을 κ°€μ§„ κ°μ²΄λŠ” ν•œ 번만 λ§Œλ“€κ³  계속 μž¬μ‚¬μš©ν•˜κ²Œ ν•œλ‹€κ±°λ‚˜, λ‚΄λΆ€μ—μ„œ 캐싱을 ν•΄μ£ΌλŠ” 식이닀.

class ColorBox {
  final int color;
  static final Map<int, ColorBox> _cache = {}; // λ§Œλ“  객체λ₯Ό μΊμ‹œλ‘œ μ €μž₯해두기 μœ„ν•œ Map
//
  const ColorBox._internal(this.color); // μ§„μ§œ const μƒμ„±μž
  //
  factory const ColorBox(int color) {
    return _cache.putIfAbsent(color, () => ColorBox._internal(color));
  } // factory constructor
}

βœ… μ™ΈλΆ€μ—μ„œ const ColorBox(0xFF0000) μ΄λ ‡κ²Œ ν˜ΈμΆœν•˜λ©΄ λ‚΄λΆ€μ—μ„œ 이미 λ§Œλ“€μ–΄λ‘” 값이 있으면 κ·Έκ±Έ μž¬μ‚¬μš©ν•˜κ³ , μ—†μœΌλ©΄ μƒˆλ‘œ λ§Œλ“€κ³  μ €μž₯ν•œλ‹€.


✏️ const vs final

ν‚€μ›Œλ“œμ–Έμ œ 고정됨?μ˜ˆμ‹œνŠΉμ§•
finalλŸ°νƒ€μž„μ— κ²°μ •final name = getName(); // μ‹€ν–‰ 쀑에 κ²°μ •ν•œ 번만 μ„€μ • κ°€λŠ₯ν•˜μ§€λ§Œ λ‚˜μ€‘μ— κ°’ 정해져도 OK
const컴파일 νƒ€μž„μ— κ³ μ •const age = 20; // μ½”λ“œ μž‘μ„±ν•  λ•ŒλΆ€ν„° κ³ μ •μ•„μ˜ˆ μ½”λ“œμ— μ¨μžˆμ„ λ•ŒλΆ€ν„° μ˜μ›νžˆ μ•ˆ 변함

⚑ 예제 비ꡐ

final now = DateTime.now(); // βœ… κ°€λŠ₯ – 싀행될 λ•Œ 값이 정해짐
const now = DateTime.now(); // ❌ 였λ₯˜ – 컴파일 νƒ€μž„μ—” μ•Œ 수 μ—†μŒ

⚑ μ½”λ“œμ—μ„œ

class MyWidget extends StatelessWidget {
  final String title; // βœ… 이건 μ™ΈλΆ€μ—μ„œ κ°’ 받을 수 μžˆμ–΄
//
  const MyWidget({super.key, required this.title}); // βœ… const μƒμ„±μž κ°€λŠ₯!
}

βœ” title은 finalμ΄μ§€λ§Œ const μ•„λ‹˜ β†’ ν•œ 번 μ •ν•΄μ§€λ©΄ 끝
βœ” μƒμ„±μžλŠ” const둜 λ§Œλ“€μ–΄μ„œ β†’ λΆˆλ³€ μœ„μ ― λ§Œλ“€ 수 있음


ꡬ뢄finalconst
μˆ˜μ • κ°€λŠ₯?❌ (ν•œ 번만 ν• λ‹Ή κ°€λŠ₯)❌ (μ˜μ›νžˆ κ³ μ •)
값이 μ •ν•΄μ§€λŠ” μ‹œμ λŸ°νƒ€μž„μ»΄νŒŒμΌ νƒ€μž„
객체 생성에 μ‚¬μš© κ°€λŠ₯?OO, 단 λ‚΄λΆ€ 값도 λͺ¨λ‘ constμ—¬μ•Ό 함
μœ„μ ―μ—μ„œ 주둜 μ“°μ΄λŠ” 곳클래슀 ν•„λ“œλΆˆλ³€ μœ„μ ―, μŠ€νƒ€μΌ κ°’ λ“±

πŸ’‘ 팁
final β†’ λ³€κ²½ λΆˆκ°€ν•œ ν•„λ“œ (μ£Όμž…λ°›μ€ κ°’ λ“±)
const β†’ μ ˆλŒ€ λ°”λ€Œμ§€ μ•ŠλŠ” μœ„μ ― or κ°’


πŸ’­ const νŠΉμ§•μ„ λ³΄λ‹ˆ statelessWidgetκ³Ό statefulWidgetμ΄λž‘ λΉ„μŠ·ν•˜λ‹€λŠ” λŠλ‚Œμ΄ λ“€μ–΄μ„œ 두 연관성이 μžˆλ‚˜ κΆκΈˆν•΄μ‘Œλ‹€.


✏️ Stateless, Stateful

κ°œλ…const vs non-constStateless vs Stateful
기쀀값이 λ°”λ€ŒλŠ”κ°€?UIκ°€ λ°”λ€ŒλŠ”κ°€?
κ³ μ •λœ 것const β†’ μ ˆλŒ€ μ•ˆ λ°”λ€œStatelessWidget β†’ UIκ°€ κ³ μ •
μœ λ™μ μΈ 것non-const β†’ μ–Έμ œλ“  λ°”λ€” 수 있음StatefulWidget β†’ setState둜 UI λ³€κ²½ κ°€λŠ₯
μ΅œμ ν™”constλŠ” μž¬μ‚¬μš© κ°€λŠ₯, μ„±λŠ₯ ν–₯상StatelessλŠ” μƒνƒœ μ—†μŒ, μž¬λΉŒλ“œλ„ 가벼움

βœ” const μœ„μ ―μ€ μ„±λŠ₯상 유리(μž¬μ‚¬μš©λ¨)
βœ” StatelessWidget μ—μ„œ const μƒμ„±μž 많이 μ‚¬μš©
βœ” StatefulWidget 도 μƒμ„±μžλŠ” const일 수 있음(μœ„μ ― μžμ²΄λŠ” λΆˆλ³€, μƒνƒœλ§Œ 변함)

πŸ” "λΆˆλ³€μ„±"μ΄λΌλŠ” 곡톡 철학은 μžˆμ§€λ§Œ, constλŠ” λ©”λͺ¨λ¦¬/μ„±λŠ₯ μ΅œμ ν™”, StatelessλŠ” UI νŒ¨ν„΄μ˜ 차이닀.


πŸ”₯ Widget μž¬μ‚¬μš© μ΅œμ ν™”

πŸš€ λͺ¨λ“  UIλ₯Ό μœ„μ ―μœΌλ‘œ κ΅¬μ„±ν•˜κ³ , μƒνƒœκ°€ λ°”λ€” λ•Œλ§ˆλ‹€ build ν•¨μˆ˜κ°€ 호좜되며 μœ„μ ―μ΄ λ‹€μ‹œ κ·Έλ €μ§€λŠ” ꡬ쑰이닀.

πŸ₯½ λ˜‘κ°™μ€ κ±Έ 맀번 μƒˆλ‘œ λ§Œλ“€λ©΄ μ„±λŠ₯이 λ–¨μ–΄μ§€κΈ° λ•Œλ¬Έμ—, μž¬μ‚¬μš© κ°€λŠ₯ν•œ μœ„μ ―μ„ λ§Œλ“€κ³ , 효율적으둜 κ΄€λ¦¬ν•˜λŠ” 게 μ€‘μš”ν•˜λ‹€.


✏️ μž¬μ‚¬μš© μ½”λ“œ

βœ… μž¬μ‚¬μš©μ„ μž˜ν•˜λŠ” μ½”λ“œ

const Text('Hello') // βœ… constλ‹ˆκΉŒ μž¬μ‚¬μš©λ¨ (buildλ§ˆλ‹€ μƒˆλ‘œ μ•ˆ λ§Œλ“€μ–΄λ„ 됨)

βœ” 컴파일 νƒ€μž„μ— λ©”λͺ¨λ¦¬μ— λ”± ν•œ 번 λ§Œλ“€μ–΄μ Έμ„œ 계속 씀
βœ” μƒνƒœκ°€ λ°”λ€Œμ–΄λ„ 이 μœ„μ ―μ€ λ‹€μ‹œ λ§Œλ“€μ§€ μ•ŠμŒ


❌ μž¬μ‚¬μš© μ•ˆ λ˜λŠ” μ½”λ“œ

  Text('Hello') // ❌ const μ•ˆ λΆ™μ˜€κΈ° λ•Œλ¬Έμ— build λ•Œλ§ˆλ‹€ μƒˆλ‘œ 생성됨

βœ– μ™Έν˜•μ€ κ°™μ•„ 보여도 맀번 μƒˆ μΈμŠ€ν„΄μŠ€ β†’ 비ꡐ λͺ» ν•˜κ³  λ‹€μ‹œ κ·Έλ¦Ό


πŸ’‘ μž¬μ‚¬μš© μ΅œμ ν™” 팁 정리

ν•­λͺ©μ„€λͺ…μ˜ˆμ‹œ
βœ… const μœ„μ ― μ‚¬μš©λΆˆλ³€ μœ„μ ―μ„ 미리 λ§Œλ“€μ–΄ μž¬μ‚¬μš©const Text('ν™•μ •')
βœ… μœ„μ ― 뢄리큰 μœ„μ ―μ„ μͺΌκ°œμ„œ μƒνƒœ λ³€κ²½ λ²”μœ„ μ΅œμ†Œν™”MyButtonWidget() λ”°λ‘œ 뢄리
βœ… ListView.builder리슀트 μœ„μ ― μž¬μ‚¬μš© μ΅œμ ν™” μžλ™ μ§€μ›μŠ€ν¬λ‘€ κ°€λŠ₯ν•œ κΈ΄ 리슀트
βœ… keys ν™œμš©μœ„μ ― κ°„ λ³€κ²½ 좔적을 λͺ…ν™•νžˆKey, ValueKey λ“±
βœ… const constructor μ •μ˜μ»€μŠ€ν…€ μœ„μ ―λ„ μž¬μ‚¬μš© κ°€λŠ₯ν•˜κ²Œconst MyWidget()

❌ μ„±λŠ₯ μ•ˆ 쒋은 예

ν•­λͺ©λ¬Έμ œμ˜ˆμ‹œ
❌ const 없이 반볡 μœ„μ ― μƒμ„±λ§€λ²ˆ μƒˆλ‘œ 그렀짐Text('반볡') in for
❌ build에 λ³€μˆ˜ν˜• μœ„μ ―μƒνƒœ λ°”λ€” λ•Œλ§ˆλ‹€ μƒˆλ‘œ 생성됨Text(DateTime.now())
❌ Stateless인데 setState처럼 μ‚¬μš©rebuildκ°€ 의미 μ—†μŒStatelessWidget μ•ˆμ—μ„œ 동적 처리

⚑ 정리

πŸ”Ή const constructor vs const μ‚¬μš©

κ΅¬λΆ„πŸ§± const constructorπŸ› οΈ const μ‚¬μš©
μ •μ˜ μœ„μΉ˜ν΄λž˜μŠ€ μ •μ˜λΆ€ (μƒμ„±μžμ— λΆ™μž„)객체 생성 μ‹œ (const MyWidget())
역할이 ν΄λž˜μŠ€λŠ” const μΈμŠ€ν„΄μŠ€ λ§Œλ“€ 수 있음이 μΈμŠ€ν„΄μŠ€λ₯Ό λΆˆλ³€μœΌλ‘œ λ§Œλ“€κ² λ‹€λŠ” 뜻
μ „μ œ 쑰건내뢀 ν•„λ“œλ„ λͺ¨λ‘ final이어야 ν•¨μƒμ„±μžκ°€ const둜 선언돼 μžˆμ–΄μ•Ό 함
μ˜ˆμ‹œconst MyWidget({super.key})const MyWidget()

πŸ”Ή const factory constructor

ν•­λͺ©μ„€λͺ…
의미const + factory β†’ 생성 μ΅œμ ν™” + μΊμ‹±κΉŒμ§€ 포함
λͺ©μ κ°™μ€ 값이면 객체 μž¬μ‚¬μš© (쀑볡 생성을 막고 λ©”λͺ¨λ¦¬ μ ˆμ•½)
λ‚΄λΆ€ κ΅¬ν˜„ 방식Map 등을 ν™œμš©ν•΄ μΊμ‹œ μ €μž₯
μ˜ˆμ‹œconst ColorBox(0xFF0000) β†’ λ‚΄λΆ€μ—μ„œ μΊμ‹œλœ 객체 λ°˜ν™˜

πŸ”Ή const vs final 차이

ꡬ뢄finalconst
μ˜λ―Έν•œ 번만 값을 μ •ν•˜λ©΄ λ³€κ²½ λΆˆκ°€μ²˜μŒλΆ€ν„° λ³€ν•˜μ§€ μ•ŠλŠ” μƒμˆ˜
πŸ•’ κ²°μ •μ‹œμ λŸ°νƒ€μž„ μ€‘μ»΄νŒŒμΌ νƒ€μž„
πŸ”„ μž¬ν• λ‹ΉβŒ λΆˆκ°€βŒ λΆˆκ°€
μ˜ˆμ‹œfinal name = getName();const age = 20;
μœ„μ ― 예final String title;const Text('κ³ μ • ν…μŠ€νŠΈ')
✏️ νŠΉμ§•μ™ΈλΆ€μ—μ„œ μ£Όμž…λ°›μ„ λ•Œ μœ μš©μœ„μ ― μž¬μ‚¬μš©κ³Ό μ΅œμ ν™”μ— 유리

πŸ”Έ Widget μž¬μ‚¬μš© μ΅œμ ν™” 팁

βœ… ν•˜λ©΄ 쒋은 κ²ƒβŒ ν”Όν•΄μ•Ό ν•  것
const μœ„μ ― 적극 μ‚¬μš©const 없이 맀번 μƒˆ μœ„μ ― λ§Œλ“€κΈ°
μœ„μ ― 뢄리 (MyButtonWidget())μ»€λ‹€λž€ build ν•¨μˆ˜μ— λ‹€ λ•Œλ €λ„£κΈ°
ListView.builder μ‚¬μš©λ¦¬μŠ€νŠΈ 직접 반볡문으둜 생성 (for λ¬Έ λ“±)
keys둜 λ³€κ²½ 좔적 관리key 없이 동적 리슀트 닀루기

πŸš€ ν•™μŠ΅ 리슀트


πŸŽ“ ν•™μŠ΅ μ™„λ£Œ 리슀트

βœ… const, final, μƒμ„±μž ꡬ쑰 이해 πŸ”

βœ… μœ„μ ― μž¬μ‚¬μš© μ΅œμ ν™” κ°œλ… 🎯

βœ… Flutter λ¬Έλ²•μ˜ 핡심 쀑 μœ„μ ― ꡬ쑰와 λ Œλ”λ§ μ„±λŠ₯ νŒŒμ•… μ™„λ£Œ


πŸ”Έ λ‹€μŒ ν•™μŠ΅ 주제 리슀트

1️⃣ Widget Lifecycle(생λͺ…μ£ΌκΈ°)

StatefulWidget이 μ–Έμ œ initState, build, dispose λ˜λŠ”μ§€ μ΄ν•΄ν•˜κΈ°
μ™œ? β†’ μƒνƒœ λ³€ν™”κ°€ λ§Žμ€ μ•±μ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό 효율적으둜 닀루렀면 κΌ­ ν•„μš”ν•˜λ‹€.

μΆ”μ²œ ν‚€μ›Œλ“œ: initState(), didUpdateWidget(), dispose()


2️⃣ State 관리 기초

setState둜 κ΄€λ¦¬ν•˜λ˜ μƒνƒœλ₯Ό 쑰금 더 μ²΄κ³„μ μœΌλ‘œ λ‹€λ£¨λŠ” 법

setState() 이해
λΆ€λͺ¨-μžμ‹ μœ„μ ― κ°„ 데이터 전달(props, callback)

이후:
Provider, Riverpod, Bloc 같은 κ³ κΈ‰ μƒνƒœκ΄€λ¦¬λ‘œ 이어가기


3️⃣ λ ˆμ΄μ•„μ›ƒ λ§ˆμŠ€ν„°ν•˜κΈ°
Expanded, Flexible, Spacer, Align, Stack, Positioned 같은 μœ„μ ―

λ ˆμ΄μ•„μ›ƒμ΄ λ§κ°€μ§€λŠ” 이유λ₯Ό μ•Œκ²Œ 되고, β€œUI” λ§Œλ“€κΈ° μœ„ν•œ λ ˆμ΄μ•„μ›ƒ 섀계 감각 ν‚€μš°κΈ°.


4️⃣ Navigator & Routing(νŽ˜μ΄μ§€ μ „ν™˜)
μ—¬λŸ¬ 화면을 μ΄λ™ν•˜κ³ , λ’€λ‘œκ°€κΈ°, 인자 전달 λ“±

Navigator 1.0 vs 2.0 차이
push, pop, pushReplacement, popUntil
Route에 데이터 μ „λ‹¬ν•˜λŠ” 법


5️⃣ μ‹€μ „ μ•± ν”„λ‘œμ νŠΈ 해보기
μ§€κΈˆκΉŒμ§€ 배운 것듀을 ν•œ 번 μ¨λ³΄λ©΄μ„œ 톡합 볡슡

μ•± 아이디어:
TODO μ•±
κ°„λ‹¨ν•œ 타이머 μ•±
κ°„λ‹¨ν•œ λ‰΄μŠ€ λ·°μ–΄ or 날씨 μ•±


πŸ’» λ§₯ ν™˜κ²½μ—μ„œλŠ” λ‹€λ₯Έ 였λ₯˜κ°€ λ°œμƒν•˜κΈ°λ„ ν•˜κ³ , κΈ°μ‘΄ μœˆλ„μš° ν™˜κ²½λ§ŒμœΌλ‘œλŠ” ν˜Έν™˜μ„± λ¬Έμ œκ°€ 있기 λ•Œλ¬Έμ— μš°μ„  λ§₯뢁을 λ³‘ν–‰ν•˜λ©° ν•™μŠ΅ν•˜λŠ”κ²Œ 쒋을 것 κ°™λ‹€.

κΈ°κΈ° 신청을 ν•΄μ„œ λ¬Έμ œκ°€ μ—†μœΌλ©΄, λ‹€μŒμ£Ό 쀑에 μˆ˜λ Ήν•΄μ„œ λ§₯ 개발 ν™˜κ²½ μ„ΈνŒ…μ„ 해야될 것 κ°™λ‹€.


🌱 였늘의 κ³΅λΆ€λŠ” 끝이 μ—†μ—ˆλ˜ 것 κ°™λ‹€..

constλ₯Ό μ§€μš°λ©΄ μ™œ 였λ₯˜λ‚˜λŠ”μ§€ ꢁ금
> stateless statfulμ΄λž‘ λΉ„μŠ·ν•œκ±° κ°™μŒ
> 근데 const constructorλŠ” 뭔지도 ꢁ금
> factory factory constructor도 μžˆλ‹€κ³  함
> constλž‘ final 차이가 λ­”μ§€ μ•Œκ³  μ‹ΆμŒ
> ....

이런 μ‹μœΌλ‘œ ν˜ΈκΈ°μ‹¬κ³Ό.. ꢁ금증이 κ°€λ“ν•œ λ¬΄ν•œμ˜ κ΅΄λ ˆμ— λΉ μ Έ μ •μž‘ λ‹€λ₯Έ μœ„μ ― κ³΅λΆ€λŠ” λͺ»ν–ˆλ˜ 것 κ°™λ‹€. ꢁ금증이 ν•΄μ†Œλ˜μ–΄μ„œ μ’‹κΈ΄ν•œλ° λ‚΄μš©μ΄ λ§Žμ•„μ„œ μ™„λ²½ν•˜κ²Œ κΈ°μ–΅ν•˜κ±°λ‚˜ λ– μ˜¬λ¦¬μ§€λŠ” λͺ»ν•  것 κ°™μ§€λ§Œ, μš°μ„  μ΄ν•΄λŠ” μ–΄λŠμ •λ„ λ˜μ–΄μ„œ λ§Œμ‘±μŠ€λŸ½λ‹€.

profile
πŸ’» [25.05.26~] Flutter 곡뢀쀑⏳

0개의 λŒ“κΈ€