counter_app
=> android
=>ios
=>lib
=> main.dart // 프로젝트 진입점, main을 포함
=> test // 비즈니스 로직 검증
=> widget_test.dart
=> pubspec.yaml // 모든 다트 프로젝트에 필수, 의존성과 메타데이터 관리
=> pubspec.lock // 편집하면 안 되는 잠금 파일 생성
=> README.md
import'RedButton.dart';
classMyappextendsStatelessWidget{
// 이 클래스의 슈퍼클래스인 StatelessWidget도 build // 메서드를 갖지만 이 메서드를 대신 호출해야 한다는 의미로 사용된다.@overrideWidget build(BuildContext context) {
// 앱의 모든 위젯에서 머티리얼 디자인 기능을 이용할 수 있도록 앱을 감싼다.returnMaterialApp(
title: 'FlutterDemo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: RedButton(),
);
}
}
new, const 생성자
플러터에서는 한 위젯의 여러 인스턴스를 만든다.
많은 내장 위젯은 일반 생성자와 const 생성자를 모두 제공한다.
가능하면 const를 사용하는 것이 좋으며, 둘 다사용하지 않으면 프레임워크가 const로 추론한다.
핫 리로드
다트는 AOT 컴파일러이면서 JIT 컴파일러다.
컴퓨터로 앱을 개발할 때는 JIT를 사용하며, just in time 컴파일러라고 부른다.
실시간으로 코드를 컴파일하고 실행한다.
배포할 때는 AOT 컴파일러를 사용한다.
위젯 트리와 형식, State 객체
플러터의 대부분의 위젯은 StatelessWidget이나 StatefulWidget의 형식을 가진다.
플러터 UI 개발은 수많은 위젯을 조합해 위젯 트리를 완성하는 것을 뜻한다.
위젯은 자신의 자식이 또 다른 위젯들을 포함한다고 설명하는 방식으로 트리를 구축한다.
모든 위젯이 child 프로퍼티를 갖는 것은 아니며, children, builder 등의 프로퍼티를 갖는 위젯도 있다.
상태를 갖지 않는 위젯
StatefulWidget은 내부 상태를 추적하며, SatelessWidget은 위젯 생명주기 동안 내부 상태를 가지지 않는다.
classSubmitbuttonextendsStatelessWidget{
// 위젯으로 전달한 모든 데이터를 설정으로 활용한다.
late finalString buttonText;
Submitbutton(this.buttonText);
@overrideWidget build(BuildContext context) {
returnTextButton(
onPressed: () { },
child: Text(buttonText)
);
}
}
버튼에 대한 텍스트를 다르게 표시할 때, 표시 문자열을 바꾸도록 플러터에 지시할 수 있다.
이는 정적이며, 직접 자신을 갱신하는 로직을 포함하지 않는다.
부모 위젯의 설정에 따라 정해진 문자열을 보여주며, 자신을 언제 어떻게 리빌드해야 하는지 모른다.
상태를 갖는 위젯
StatefulWidget 클래스는 Stateless와 다르게 build 메서드를 포함하지 않는다.