π― μ€λμ 2μ£Όμ°¨ κΈ°λ₯μ± μμ ―κ³Ό 3μ£Όμ°¨ μνκ΄λ¦¬μ λν΄ λ³΅μ΅νκ³ μ κ°μλ₯Ό λ€μ λ€μλ€.
κ·Έλ¦¬κ³ μνκ΄λ¦¬μ λ μ΄μμμ λν΄ μΆκ° νμ΅μ νλλ°, μνκ΄λ¦¬λ λ΄μ©μ΄ μ΄λ €μμ μ¬μ ν μ΄ν΄νκΈ΄ νλ€μλ€.
λ μ΄μμμ ν·κ°λ¦¬λ λΉμ·ν κΈ°λ₯μ΄ μμ΄μ λΉκ΅νλ μκ°μ κ°μ‘λ€.
μ€νμλ ν μκ° νλ‘μ νΈ λ°ννκ° μμκ³ , νμλ€κ³Ό KPT νκ³ λ₯Ό μμ±νλ€.
κ·Έλ¦¬κ³ , λ§μ‘±λ νκ°, λ€λ©΄ νκ°, κ°μΈ κ³Όμ - νμ΅ μΌμ§ μ μΆλ μλ£νμλ€.
π μμ ―
π μνκ΄λ¦¬
π μνκ΄λ¦¬
μμ ―μ λ μ΄μμμ ꡬμ±νλ κ±°λΌ μ§κ΄μ μ΄κ³ , 무μΈκ° μ½κ² κΈ°λ₯μ μ°Ύλ λλμΈ λ°λ©΄μ μνκ΄λ¦¬λ μ΄λ ΅λ€. μ μ¬μ©ν΄μΌ λλμ§, μ΄λ€ μ΄μ μ΄ μλμ§λ μκ² μΌλ, μ½λμμ μ΄λ₯Ό νμ©ν΄μ μμ±νλ€λκ² μ½μ§ μμ 보μΈλ€.
β
Gitμ μ¬μ©νκΈ° μν΄ λμμ£Όλ νλ‘κ·Έλ¨μΈforkκ° μ€μΉλμ΄ μλλ°, μμ μ νμΌ λ§λ€μ΄μ μλ₯Ό νμ©ν΄ Gitμ μ λ‘λνλ κ²μ ν΄λ΄€μλ€.
β μ΄μ λ€μλ Git νΉκ°μ΄ μ‘°κΈ μ΄λ ΅κ³ , μ€μ μ¬μ©ν΄λ³Έμ§ μ’ λ κ² κ°μμ, κ³μ λ λ€μ λ‘κ·ΈμΈνκ³ μ΄κ²μ κ² λλ¬λ³΄κΈ°λ νκ³ μ΄ν΄λ³΄μλ€.
Widget Lifecycle
π― μ μλͺ μ£ΌκΈ°λ₯Ό μμμΌ ν κΉ?
βStatefulWidgetμ μν λ³νμ λ°λΌ νλ©΄μ κ³μ λ€μ 그리λλ°, κ·Έ κ³Όμ μμ μ ν΄μ§ μμλλ‘ ν¨μλ€μ΄ νΈμΆλλ€.
π μΈμ μ΄κΈ°κ°μ μ€μ ν΄μΌ νλμ§
π§Ό μΈμ 리μμ€λ₯Ό μ 리ν΄μΌ νλμ§
π μν λ³κ²½ μ μ΄λ€ ν¨μκ° λͺ λ² λΆλ¦¬λμ§ μμμλ€.
π« μλͺ μ£ΌκΈ° νλ¦
createState() β initState() β didChangeDependencies() β build() β didUpdateWidget() β (widget λ³κ²½λ λλ§) β setState() β build() λ°λ³΅ β deactivate() β dispose()
λ©μλ μΈμ νΈμΆλ¨? μ€λͺ createState()μμ ―μ΄ λ§λ€μ΄μ§ λ ν λ² StatefulWidgetμ΄ μ΄λ€ μν(State)λ₯Ό μ¬μ©ν μ§ μ°κ²°initState()μν(State)κ° μμ±λ λ ν λ² μ΄κΈ° λ°μ΄ν° μ€μ , API νΈμΆ λ± μ¬κΈ°μ! ( super.initState()κΌ νΈμΆ!)didChangeDependencies()initState()μ§ν + μμ‘΄μ± λ°λ λcontext.dependOnInheritedWidgetOfExactType()νΈμΆ μbuild()μν λ³κ²½λ§λ€ νλ©΄ 그릴 λλ§λ€ νΈμΆλ¨. setState()νλ©΄ λ€μ μ€νλ¨didUpdateWidget()λΆλͺ¨ μμ ―μ΄ μλ‘μ΄ μΈμλ₯Ό λ³΄λΌ λ oldWidgetκ³Ό λΉκ΅ κ°λ₯ deactivate()μμ ―μ΄ μ κ±°λ λ μ§μ νλ©΄μμ μ¬λΌμ§ μ€λΉ μ€ dispose()μμ ―μ΄ μμ ν μ κ±°λ λ 컨νΈλ‘€λ¬, μ€νΈλ¦Ό λ± λ©λͺ¨λ¦¬ ν΄μ μμ (νμ)
μμ μ’ λ₯ μ΄λμ? μ? μ λλ©μ΄μ 컨νΈλ‘€λ¬ μ μΈ initState()ν λ²λ§ μ΄κΈ°νν΄μΌ νλκΉ API 첫 νΈμΆ initState()ordidChangeDependencies()context μΈ μ μλ κ³³μμ λ©λͺ¨λ¦¬ ν΄μ dispose()μ€νΈλ¦Ό, 컨νΈλ‘€λ¬ κΌ μ 리 μν κ°±μ setState()+build()UI λ€μ 그릴 λ
π― μ μν κ΄λ¦¬λ₯Ό μμμΌ ν κΉ?
Flutterλ UI = ν¨μ(μν)λΌκ³ μκ°ν΄.
μ¦, βλ°μ΄ν°κ° λ°λλ©΄ UIλ λ°λλ€β λ κ²μ΄λ€.
κ·ΈλΌ μ΄ λ°μ΄ν°λ₯Ό μ΄λμ, μ΄λ»κ² λ°κΏκΉ?
π
Getxvskey
β getxμ κ°μ λΌμ΄λΈλ¬λ¦¬λ μνλ₯Ό λ³κ²½νκ³ μΆμ μμ ―μ μ€μ κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄ μ λ¬ λ°κ³ , μ§μ μ λ¬ν΄μ€λ€.
β λ°λ©΄μkeyκ°μ κ²½μ°, keyλ₯Ό κ°μ§ μμ ―μ μ§μ μ μΌλ‘ μ κ·ΌνκΈ° μν΄μ μ΄λ€.
μλ₯Ό λ€μ΄ μμ ―μ μ¬μ΄μ¦ κ°μ ꡬνκΈ° μν΄ keyλ₯Ό λ±λ‘ν΄μ keyλ₯Ό νΈμΆνλ λ°©μμΈλ°, ν΄λΉ λ°©λ²μ μ½λκ° λ§€μ° λ³΅μ‘νκΈ° λλ¬Έμ getxλ provider κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ€κ³ νλ€.
class Counter extends StatefulWidget { const Counter({super.key}); // State<Counter> createState() => _CounterState(); } // class _CounterState extends State<Counter> { int count = 0; // Widget build(BuildContext context) { return Column( children: [ Text('Count: $count'), ElevatedButton( onPressed: () { setState(() { count++; // β μ΄ μμμ μνλ₯Ό λ°κΎΈλ©΄ }); // π build()κ° λ€μ νΈμΆλΌμ UIκ° κ°±μ λ¨! }, child: const Text('μ¦κ°'), ), ], ); } }
π ν΅μ¬ νλ¦
βcountμνλ₯Ό μ μ
β λ²νΌμ λλ₯΄λ©΄setState()μ€ν
β λ΄λΆ λ³μ κ° λ³κ²½
βbuild()λ₯Ό λ€μ μ€νν΄μ UI κ°±μ π‘
π« μνλ₯Ό μμ ― κ°μ μ£Όκ³ λ°κΈ°
μκ³ κ΅¬μ‘°Treeλ‘, λΆλͺ¨ β μμ μΌλ‘ κ°μ μ λ¬νκ³ , μμ β λΆλͺ¨ λ‘ μ΄λ²€νΈλ₯Ό μ λ¬νλ κ΅¬μ‘°κ° κΈ°λ³Έμ΄λ€. μ΄κ² κΉμ΄μ§μλ‘ μ μ°¨κ° κΈΈκ³ , 볡μ‘ν΄μ getxμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μΈλ°...
β μ 리
setState()π Stateful μμ ― λ΄λΆμμ μν λ°κΎΈκ³ UI λ€μ κ·Έλ¦Όpropsμ λ¬ π λΆλͺ¨ β μμμκ² λ°μ΄ν° μ£ΌκΈ°callbackμ λ¬ π μμ β λΆλͺ¨μκ² μ΄λ²€νΈ μ리기
μμ ― ν΅μ¬ μν μμ£Ό μ°μ΄λ μν© Row,Columnκ°λ‘/μΈλ‘λ‘ μμ ― λμ΄ κΈ°λ³Έ UI μ λ ¬ Expandedλ¨μ 곡κ°μ κ· λ±νκ² μ°¨μ§ λ²νΌ, 리μ€νΈ λ± μλ μ±μ λ μ΄μμ Flexibleλ¨μ 곡κ°μ λΉμ¨λ‘ μ°¨μ§ (λ μ μ°) κ³΅κ° λλκΈ°, ν¬κΈ° μ νμ΄ νμν λ SpacerλΉ κ³΅κ° λ£κΈ° (λ³΄ν΅ Expandedλ‘λ κ°λ₯)μμͺ½ λμ°κΈ°, κ°κ²© μ‘°μ λ± Stackμμ ―μ κ²ΉμΉκ² λ°°μΉ μμ΄μ½ μμ λ±μ§, μΉ΄λ λ°°κ²½ λ±
π¬ κ°μμμλ spacer λμ μ sized boxλ₯Ό μ΄ κ² κ°λ€.
Column( children: [ Text('μ'), Text('μλ'), ], )Row( children: [ Icon(Icons.star), Text('κ°λ‘ λμ΄'), ], )β μ΄μ νμ΅νλ childrenμ μ΄λ κ² μμ ―μ΄ μ¬λ¬κ°μΌ λ μ¬μ©νλ€.
Row( children: [ Expanded(child: Container(color: Colors.red)), // β λ¨μ κ³΅κ° λ€ μ°¨μ§ Container(width: 100, color: Colors.blue), ], )Expanded(flex: 2, child: ...)β λ¨μ 곡κ°μ μλμΌλ‘ κ½ μ±μ°λ©°, 보ν΅
flexμμ±λ κ°μ΄ μ΄λ€.
Flexible( flex: 1, child: Container(color: Colors.green), )β
Expandedλ λΉμ·νμ§λ§Expandedλ 무쑰건 κ½ μ±μ°λ λ°λ©΄μ, μ‘°κΈ λ μ μ°νλ©°, 곡κ°μ΄ λΆμ‘±νλ©΄ κ·Έμ λ§μΆ° μ€μ΄λ λ€.
νλͺ© Expandedπ¦Flexibleπ§π λͺ©μ λ¨μ 곡κ°μ 무쑰건 κ½ μ±μ 곡κ°μ νμν λ§νΌλ§ μ¬μ© π κΈ°λ³Έ λμ νμ μ΅λ κ³΅κ° μ°¨μ§ν¨ μμ μμ ―μ΄ μνλ λ§νΌλ§ μ°¨μ§ βοΈ λ΄λΆ μ΅μ fit: FlexFit.tightκ³ μ fit: FlexFit.tight or looseμ ν κ°λ₯π§ child νμ β μμ β μμ π― μ£Ό μ©λ λ²νΌ λ± κ½ μ±μ°λ λ μ΄μμ ν μ€νΈλ μμ μμ ― μ μ°νκ² λ£μ λ
π¦
ExpandedRow( children: [ Expanded( child: Container( height: 50, color: Colors.red, ), ), Container( width: 100, height: 50, color: Colors.blue, ), ], )β λΉ¨κ° λ°μ€κ° λ¨μ κ³΅κ° μ λΆ μ°¨μ§νλ€.
π¦
FlexibleRow( children: [ Flexible( fit: FlexFit.loose, // π‘ μνλ λ§νΌλ§ μ°¨μ§ child: Container( width: 80, height: 50, color: Colors.red, ), ), Container( width: 100, height: 50, color: Colors.blue, ), ], )β λΉ¨κ° λ°μ€λ 80λ§νΌλ§ μ°¨μ§νλ€. β π‘ μ μ°ν¨!
β ν΅μ¬ ν μ€ μμ½
πExpanded= λ°λμ κ³΅κ° λ€ μ°¨μ§ βκ°μ
πFlexible= νμνλ©΄ κ³΅κ° μ€μΌ μ μμ β μ ν
π μμ
μμ μν© μΆμ² μμ ― λ²νΌ λ κ°λ₯Ό λλν, λκ°μ ν¬κΈ°λ‘ Expandedν μ€νΈκ° λ무 컀μ§λ©΄ μ€μ΄κ² νκ³ μΆμ FlexibleμΌλΆλ κ½ μ±μ°κ³ , μΌλΆλ κ°κ²©λ§ μ£ΌκΈ° Expanded+Spacer
Row( children: [ Icon(Icons.arrow_back), Spacer(), // β μ€κ°μ λΉ κ³΅κ° Icon(Icons.menu), ], )
νλͺ© Spacerπ§±Flexibleπ§π λͺ©μ λΉ κ³΅κ° λ§λ€κΈ° (κ°κ²© λ²λ¦¬κΈ°) μμ ―μ μ μ°νκ² λ°°μΉ π§© child νμ β μμ β νμ ( Flexible(child: ...))βοΈ λ΄λΆ ꡬν Flexible(child: SizedBox())λ‘ λμ΄ μμμ§μ μ μ°ν μμ ― λ£κΈ° κ°λ₯ π ν¬κΈ° μ€μ flexλΉμ¨λ‘ 곡κ°λ§ μ°¨μ§fitμ΅μ μΌλ‘ μ€μ΄λ€κ±°λ λμ΄λ¨π― μ£Ό μ©λ μμ ― μ¬μ΄ κ°κ²©μ μλ μ‘°μ μμ ― ν¬κΈ°λ₯Ό μ μ°νκ² μ‘°μ
νλͺ© Spacerπ§±SizedBoxπ¦π λͺ©μ λ¨μ 곡κ°μ μ°¨μ§νλ λΉ μμ ― κ³ μ λ ν¬κΈ°μ λΉ κ³΅κ° λ§λ€κΈ° π μ¬μ© μμΉ Row,Columnλ΄λΆ (Flexκ³μ΄λ§)μ΄λλ μ¬μ© κ°λ₯ (Stack, Center λ± ν¬ν¨) π ν¬κΈ° μ§μ μ§μ ν¬κΈ° μ§μ β β μλμΌλ‘ λμ΄λ¨ width,heightμ§μ μ€μ κ°λ₯π§ flex κ°λ₯ flex: 1λ±μΌλ‘ λΉμ¨ μ€μ κ°λ₯λΉμ¨ μ§μ β, 무쑰건 κ³ μ ν¬κΈ° π¬ μμ μ©λ μμ ― μ¬μ΄μ λΉμ¨ κ°κ²© λμ°κ³ μΆμ λ μμ ― μ¬μ΄μ λ± 8px κ°κ²© λ£κ³ μΆμ λ
π¦ SizedBox μμ
Column( children: [ Text('μ'), SizedBox(height: 20), // β μμλλ‘ 20px κ°κ²© Text('μλ'), ], )β λ± λ¨μ΄μ§λ κ°κ²©μ΄ νμν λ μ’μΌλ©°, ν¬κΈ° μλ
SizedBox()λ κ·Έλ₯ λΉ μμ ―μ΄λ€.
π§± Spacer μμ
Row( children: [ Icon(Icons.menu), Spacer(), // β λ¨μ κ³΅κ° λ€ μ°¨μ§ν΄μ μ€λ₯Έμͺ½ λ°μ΄λ Icon(Icons.search), ], )β
Spacer()λ λ¨μ 곡κ°μ μλμΌλ‘ μ±μμ£Όλ©°, flex μ€μ κ°λ₯νλ€.Spacer(flex: 2)λ±
Stack( children: [ Container(width: 100, height: 100, color: Colors.blue), Positioned( right: 0, bottom: 0, child: Icon(Icons.star, color: Colors.yellow), ), ], )β μ λ²μ λ°°μ λ Stack, μ¬μ©μ μμ΄μ½μ
+λ²νΌμ κ²Ήμ³ λ§λλ κ² μ²λΌ νμ© κ°λ₯νλ€.
μμ ― μ€λͺ Centerκ°μ΄λ° μ λ ¬ AlignμμΉλ₯Ό μ’μΈ‘/μ°μΈ‘/νλ¨ λ±μΌλ‘ μ€μ κ°λ₯ SizedBoxκ³ μ ν¬κΈ° or κ°κ²© λ§λ€κΈ°
π μκ³ λ¦¬μ¦
- λ€μ μ£Όμ°¨λΆν° λ§€μΌ μμΉ¨ 1μκ°μ© μ§ννκ² λλλ°, λ§μ½ μ΄λ ΅κ±°λ, λ¬Έμ κ°μκ° λΆμ‘±ν κ²½μ° μΆκ°μ μΌλ‘ νμ΅μ μ§ννλκ² μ’μ κ² κ°λ€.
μμ§ μ½λκ° μ΅μνμ§ μκ³ , λκ° λ±λ±νκ² κ΅³μ΄μλ κ² κ°μμ... λ§λλ§λνκ² λ§λλ €λ©΄ νμν κ² κ°μλ°, λ€λ₯Έ λ°μ μκ³ λ¦¬μ¦ λ¬Έμ λ₯Ό νλμ© νμ΄λ³΄λ κ²λ λμμ§ μμ κ² κ°λ€.
π κ°μ
- Dart κΈ°μ΄ λ¬Έλ²μΌλ‘ κ°μλ μ§κΈλμ΄ μκ°μ μ§νν΄μΌ λ κ²μΈλ°, μμ§ κ°μ μμ€μ λͺ¨λ₯΄λ κ³΅λΆ μκ°μ΄ μΌλ§λ κ±Έλ¦΄μ§ λͺ¨λ₯Έλ€.
κΈ°μ‘΄μλ μ λ£κ±°λ, μ€κ°μ€κ° λ©μΆ°μ κΆκΈν μ μ ν΄κ²°νκ³ μ΄μ΄ λ£κ±°λ νμλλ°... λ§μ½, λΆλκ³Ό λ΄μ©μ΄ μ μ ν΄μ κΈ°κ° μμ μ΄λ°νμ§ μκ² μ¬μ λ‘κ² μκ°ν μ μλ€λ©΄, ν΄λΉ κ°μμ λν΄ μΆκ° νμ΅μ μ§ν ν μμ μ΄λ€.
π₯½ λͺ¨μ
- μ½λμ μ΅μν΄μ§λκ² μ’κ³ , 무μλ³΄λ€ μ€μ μΌλ‘ μ§μ μμ±ν΄λ³΄λκ² μ’λ€κ³ ν΄μ, λ΄κ° μνλ μ± νλλ₯Ό μ νν΄μ λͺ¨μνκ³ μ νλ€.
- μ°μ λ΄κ° μ¬μ©ν΄λ³Έμ μλ ν루콩μ λͺ¨μν΄λ³΄λ©΄ μ΄λ¨κΉ μΆμλ°, κ°μμμ μ€μ΅μΌλ‘ λμλ λ©λͺ¨ κ΄λ ¨ν΄μλ νμ©ν μ μμ κ² κ°λ€.
ν루 μΌκΈ° μ΄νλ‘, νλ©΄ UI/UX ꡬμ±κ³Ό λ μ΄μμ, ν μ€νΈλ₯Ό μ λ ₯νκ³ μ μ₯νκ³ , μμ νκ³ , μμ νλ κΈ°λ₯κΉμ§ ν΄λ³΄λ €κ³ νλ€.- κ·ΈμΉλ§ μ΄κ±Έ μΈμ κΉμ§ μ΄λ λΆλμΌλ‘ μλ£ν μ§λ μμ§ λͺ¨λ₯΄κ² λ€. ν λ λ μ‘°κΈμ© νλ λ°©ν₯μΌλ‘ κ°μ§ μμκΉ μΆλ€.
π» Git
- μμ λͺ¨μμ΄λ, νμ΅νλ©΄μ κ°μΈ, ν νλ‘μ νΈλ₯Ό μ§νν λ Gitμ μ°λ μ°μ΅μ κ³μν΄μ μ΅μν΄μ§κΈ°κ° νμνλ€.
λ μ΄λ€ νμ΅μ΄ νμν κΉ..π¦
π KDT
Keep- μ견μ μ μνκ³ μ€λνκ³ λ°μλ€μ΄λ νμκ³Όμ μμ¬μν΅κ³Ό μ΄λ €μλ μμΈ, μν λΆλ΄
Problem- νμκ³Ό λ°μΌλ¦¬ μ€ν¬λΌ 곡μ κ° μ μλμ΄μ νμ΅ νν©λ μ 곡μ κ° μλ μ
Try- μλ‘ νμ΅ μ§λλ₯Ό 곡μ νκ³ , λ¬Έμ μ μ΄ λ°μνλ€λ©΄ λμμ μ£Όλ λ± νλ‘μ νΈ μΈμ μΆκ°μ μΈ μν΅μ΄λ μ‘λ΄λ μμΌλ©΄ μ’μ§ μμκΉ
π κ°μΈ νΌλλ°±(λλμ ) - μ²μμλ λ°λ‘ ν νλ‘μ νΈλ μλ€κ³ ν΄μ μ΄λ»κ² μ§νλ μ§ κ±±μ μ΄ λ§μλλ°, λ€λ€ μ κ·Ήμ μΌλ‘ μ견 λλμκ³ , μλ‘ μ‘°μ¨νμλ©΄μ μν΅νλ λͺ¨μ΅μ λ€νμ΄λΌκ³ μκ°νμ΅λλ€.
λ¨Όμ β~λ΄μ© μ΄λ»κ² ν κΉμβ νμλ©΄μ λ€κ°μ΄ μ°Έμ¬ν μ μλλ‘ μ΄μΌκΈ° κΊΌλ΄μκΈ°λ νκ³ , μ΄μ¬ν μ΄ννλ λΆ μμ΄ μ΄λ² μ£Όμ°¨ λ§μΉ μ μμ΄μ μ’μλ κ² κ°μ΅λλ€.
λ΄ν₯μ μ΄λ€ 보λ νλ‘μ νΈ κ°μ κ±°λ, μ μΆν΄μΌ λλ κ²μ λν΄μλ§ μ΄μΌκΈ°λ₯Ό λλκ³ μμ§λ§ μ‘°κΈ λ νμ΅μ΄λ λ€λ₯Έ μ΄μΌκΈ°λ€λ λλ μ μμΌλ©΄ μ’κ² μ΅λλ€!
λ€λ€ κ³ μνμ ¨μ΅λλΉπ
π μ¨λ³΄λ© μ£Όμ°¨ λ§λ¬΄λ¦¬
π μκ°ν
- 12μκ° μ§μ€!
- [μ±κ°λ° μ’ ν©λ°] κ°μλ‘ μ»€λ¦¬νλΌ νλ¦ νμ
- μ¬λ, λ Έμ , zep λ± νμ΅ κ³΅κ°μ μ΅μν΄μ§κΈ°
- νΉκ° μκ°μ zoom μ μνκΈ°
- μ μ€/ν΄μ€ 체ν¬νλ μ΅κ΄!
- νν°λκ» μ§λ¬ΈνκΈ°, λ§€λμ μ μν΅νκΈ°, νμλ€κ³Ό μ€ν¬λΌνκΈ° λ±λ±..
π 2μ£Όμ°¨ μκ°ν
π₯ Dart λ¬Έλ² μ£Όμ°¨μλ ν νλ‘μ νΈ μμ΄ κ°μΈ κ³Όμ λ§ μλ€κ³ νλ€..! π₯
π₯ κ·Έλμ κΈ°μ΄ λ° μ¬ν μ§νν λλ κ°μΈ νμ΅μ μ’ λ μ§μ€ν μ μμ΄μ λ₯λ ₯μ λμ΄μ¬λ¦¬κΈ°μ μ’μ κ² κ°λ€. π₯
π Dart νλ‘κ·Έλλ° Chapter λ°μ
π ν€μλ
β 쑰건문과 λ°λ³΅λ¬Έ
β ν¨μμ 컬λ μ
β ν¨μν νλ‘κ·Έλλ°
β ν΄λμ€μ λ©μλ
β κ°μ²΄μ§ν₯κ³Ό μμ
π± μ΄λ² μ£Όμ°¨μλ μΊ ν μνμ μ΅μν΄μ§κΈ°, κ³΅λΆ μ΅κ΄ μ΅νκΈ°λ₯Ό μ μ μν κ² κ°λ€.
νμ΅λμ΄λ κ·Έ λ°λλ λμ§ μμ κ² κ°μ§λ§ κ°μκΈ° 12μκ° νμ΅νκΈ°λ μ½μ§ μμΌλκΉ λλ¦ λ§μ‘±νλ€.
π± λ€μ μ£Όμ°¨μλ 본격μ μΌλ‘ Dart λ¬Έλ² κΈ°μ΄μ λν΄ μ§νλ κ² κ°μμ κΈ°λλλ€!
λκ° μν 곡μ κ°μ΄ κ°λ
μ μκ² κ³ , μμλ μκ² μ§λ§ κ·Έκ±Έ νμ©νκ±°λ μ¬νν λ¬Έμ κ° μλ€λ©΄ ν΄κ²°μ΄ μ΄λ ΅λ¬κΉ μ μνλκ² μ‘°κΈ μ΄λ €μ΄ κ² κ°λ€.