Flutter/Dart

공식 문서이다. 내 생각에는 친절하기는 하지만 처음 하는 사람이 보기에는 다른 자료나 ai 를 참조해야 할 것 같다.

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key}); 
  //const MyApp({Key? key}) : super(key: key);와 같다.


  // 이 위젯은 너의 애플리케이션의 뿌리야.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // 이 앱의 테마입니다.
        //
        // 이렇게 해보세요: "flutter run"으로 앱을 실행해 보세요.
        // 앱에 보라색 툴바가 보일 겁니다. 앱을 종료하지 않고,
        // 아래 colorScheme에서 seedColor를 Colors.green으로 변경해 보세요.
        // 그런 다음 "핫 리로드"를 호출합니다(변경 사항을 저장하거나 "핫"을 누르세요)
        // Flutter를 지원하는 IDE에서 "새로고침" 버튼을 누르거나, "r" 키를 누르세요
        // 앱을 시작하는 명령줄).
        //
        // 카운터가 0으로 다시 재설정되지 않았음을 확인하세요. 애플리케이션
        // 상태는 다시 로드하는 동안 손실되지 않습니다. 상태를 재설정하려면 핫
        // 재시작을 대신 사용하세요.
        //
        // 이는 값뿐만 아니라 코드에도 적용됩니다. 대부분의 코드 변경 사항은
        // 핫 리로드만으로 테스트할 수 있습니다.
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  // 이 위젯은 애플리케이션의 홈 페이지입니다. 상태를 가지는 위젯으로,
  // (아래에 정의된) State 객체를 가지고 있으며, 이 객체에는 위젯의
  // 모양에 영향을 미치는 필드가 포함되어 있습니다.

  // 이 클래스는 상태에 대한 구성입니다. 이 클래스는 (이
  // 부모(이 경우 App 위젯)가 제공한 제목을 소문자로 변환하고
  // State의 build 메서드에서 사용됩니다. Widget 서브클래스의 필드는
  // 항상 "final"로 표시됩니다.

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
        // 이 setState 호출은 Flutter 프레임워크에 무언가 변경되었음을 알립니다
        // 이 State에서 변경되었으며, 이로 인해 아래의 build 메서드가 다시 실행됩니다
        // 디스플레이가 업데이트된 값을 반영할 수 있도록. 만약 우리가 변경했다면
        // _counter를 setState() 호출 없이 변경하면 build 메서드가 호출되지 않을 것입니다
        // 다시 호출되면 아무 일도 일어나지 않는 것처럼 보일 것입니다.
        // 리스타트를 대신 사용하세요.
        //
        // 이는 값뿐만 아니라 코드에서도 작동합니다: 대부분의 코드 변경 사항은
        // 핫 리로드만으로 테스트할 수 있습니다.
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    // 이 메서드는 setState가 호출될 때마다 다시 실행됩니다.
    // 예를 들어 위 _incrementCounter 메서드에서처럼요.
    //
    // Flutter 프레임워크는 빌드 메서드가 다시 실행되도록 최적화되었습니다.
    // 빠르므로, 위젯 인스턴스를 개별적으로 변경할 필요 없이 업데이트해야 하는 모든 것을 다시 빌드할 수 있습니다.
    // 개별적으로 위젯 인스턴스를 변경할 필요 없이 업데이트해야 하는 모든 것을 다시 빌드할 수 있습니다.
    return Scaffold(
      appBar: AppBar(
        // 직접 해보기: 여기 색상을 특정 색상(예: Colors.amber)으로 변경해 보고 핫 리로드를 실행해 보세요. 
        //그러면 AppBar의 색상만 변경되고 다른 색상은 그대로 유지되는 것을 확인할 수 있습니다.
        // Colors.amber 같은 색상으로 바꿔 보세요)으로 변경한 후 핫 리로드를 실행하면
        // AppBar 색상만 변하고 다른 색상은 동일하게 유지되는 걸 볼 수 있습니다.
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        // 여기서는 App.build 메서드에 의해 생성된 MyHomePage 객체에서 값을 가져와
        // 앱바 제목을 설정하는 데 사용합니다.
        title: Text(widget.title),
      ),
      body: Center(
        // Center는 레이아웃 위젯입니다. 단일 자식을 받아
        // 부모의 중앙에 배치합니다.
        child: Column(
          // Column은 레이아웃 위젯입니다. 자식 위젯 목록을 받아
          // 수직으로 정렬합니다. 기본적으로 자동으로 크기를 조정하여
          // 자식들을 수평으로 배치하고, 부모와 같은 높이가 되도록 노력합니다.
          //
          // Column은 자신의 크기를 조절하고 제어하기 위한 다양한 속성을 가지고 있습니다
          // 자식 요소들을 배치하는 방법입니다. 여기서는 mainAxisAlignment를 사용하여
          // 자식 요소를 수직으로 중앙 정렬합니다. 여기서 주축은 수직입니다
          // 축은 열이 수직이기 때문입니다(교차 축은
          // 가로 방향).
          //
          // 시도해 보세요: "디버그 페인팅"을 실행해 보세요(IDE에서 "Toggle Debug Paint"를 선택하거나
          // 콘솔에서 "p"를 누르세요), 그러면
          // 각 위젯에 대한 와이어프레임
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text('You have pushed the button this many times:'),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // 이 후행 쉼표는 빌드 메서드의 자동 서식을 더 좋게 만듭니다.
    );
  }
}

플러터 데모 파일의 main.dart이다.

문법 헷갈리는 것들

  • func({argname}) : 함수선언에 괄호안에 중괄호가 들어가있다. named argument이다. 호출할 때 func(argname : value) 형식으로 호출한다.

  • var func() ⇒ express 은 함수 선언이다.

  • () ⇒ {} 이건 익명 함수(람다) 이다.

  • const MyApp({super.key}); 는, const MyApp({Key? key}) : super(key: key); 와 같다. 부모에 키를 넘겨주는 건데, 같은 위젯을 구분하기 위해서(element 를 새로 만들지, 재사용할지) key 가 있다. key 는 상태관리에서 아주 유용하다.

Last updated

Was this helpful?