CH.1 플러터
Chapter Point
• 플러터란?
• 다트란?
• 플러터의 동작원리
• 플러터가 다트를 사용하는 이유는 무엇인가
• 플러터를 언제 사용해야할까?
1.0 플러터란
1.1 플러터에서 다트를 사용하는 이유
- 다트는 JIT(just-in-time) 컴파일과 AOT(ahead-of-time)컴파일을 모두 지원한다.
- AOT 컴파일러는 다트 코드를 그에 맞는 네이티브 코드로 바꿔줘서 플러터가 모두에게 빠르게 동작하며 플러터 전체 프레임워크의 대부분을 다트로 구현 가능하게 한다.
- 다트의 선택형 JIT 컴파일러는 핫 리로드(hot reload)를 지원해 빠른 개발속도와 반복(iteration)을 가능하게 해 생산성을 높혀준다.
- 다트는 객체지향이기에 마크업 언어를 사용하지 않고 다트 언어만으로 시각적 사용자 경험을 쉽게 구현한다.
- 기존 언어(Java, Javascript 등) 과 유사해 생산성이 좋고 예측이 가능하다. 기존 다른 언어에 익숙할수록 쉽게 접근할 수 있다.
1.2 다트
1.3 모바일 개발의 종류
1.3.1 네이티브 개발(IOS, Android)
1.3.2 자바스크립트 기반 크로스 플랫폼
![](https://blog.kakaocdn.net/dn/xpeEJ/btsEKGtTXNb/30y9kmKF6MFC3MnknBszo0/img.png)
1.3.3 플러터
![](https://blog.kakaocdn.net/dn/tkT73/btsEI9iJjz7/o3o9JI1xhh2KJ5bQocXEK0/img.png)
1.4 플러터의 장점
1.4.1 자바스크립트 다리가 없다.
1.4.2 컴파일 시간
1.4.3 한 번의 구현으로 모든 플랫폼 배포
1.4.4 코드 공유
1.5 플러터 동작 원리 간단 소개
다른 객체가 없다는 건 아니고, 앱의 모든 조각이 위젯이라는 의미이다.
1.5.1 모든 것이 위젯
- 레이아웃: Row, Column, Scaffold, Stack
- 구조: Button, Toast, MenuDrawer
- 스타일: TextStyle, Color
- 애니메이션: FadeInPhoto, Transform
- 위치와 정렬: Center, Padding
1.5.2 위젯으로 UI만들기
플러트는 상속(inheritance)보다 조합(composition)을 우선시하며 이를 이용해 고유한 위젯을 만든다. 대부분의 위젯은 작은 위젯을 합쳐 만든다. 즉 플러터는 다른 위젯을 상속받아 커스텀 위젯을 만들지 않는다는 의미이다.
//class AddToCartButton extends Button{} // 잘못 된 코드
class AddCartButton extends StatelessWidget{
//...클래스 멤버
// Button을 다른 위젯으로 감싸서, 즉 위젯을 조합해 커스텀 위젯을 만든다.
@override
build() {
return Center( // AddToCartButton을 중앙으로 정렬하는 위젯
child: Button( // 텍스트를 전달하는 새 커스텀 컴포넌트를 만든다.
child: Text('Add to Cart'),
)
);
}
}
1.5.3 위젯 형식
상태가 없는 위젯(StatelessWidget)
: 어떠한 정보를 저장하지 않기에 사라져도 영향이 없으며 언제 파괴되어도 괜찮은 위젯. 생명주기가 외부에 의해 결정되며, 그렇기에 언제 위젯을 트리에서 제거 혹은 리빌드 해야할지 프레임워크에 알리지 않으며 프레임워크에서 언제 리빌드 할 지를 알려준다.
class AddCartButton extends StatelessWidget{
@override
build() {
return Center(
child: Button(
child: Text('Add to Cart'),
)
);
}
}
AddCartButton은 상태가 없는 위젯이다. 그렇기에 따로 상태를 관리하거나 트리의 어떤 부분도 알 필요가 없다. 그저 사용자가 해당 버튼을 눌렀을때 지정된 함수를 실행하는게 이 위젯의 임무다. 그럼 이 버튼의 텍스트를 Add to Cart 에서 Remove from Cart 로 다른위젯에서 정보를 전달하면 AddCartButrton은 다시 그려진다. 즉, 상태가 없는 위젯은 새로운 정보에 반응(react)한다.
상태가 있는 위젯(StatefulWidget)
: 항상 State 객체를 갖는다. State객체는 setState라는 메소드를 제공하는데, 이는 위젯을 다시 그려야 함을 플러터에 알린다.
Widget build(BuildContext context){
return Container( // build 메서드는 항상 위젯을 반환한다.
child: Row(
children: List<Widget> [
IconButton(
icon: Icons.subtract,
onPressed: (){
setState((){ // 사용자의 동작을 감지하는 버튼 위젯의 내장 프로퍼티
this.quantity--; // 상태에 저장된 수량을 감소시킨다
});
}
),
new Text("Qty:" ${this.quantity}), //상태 객체의 수량이 바뀌면 트리의 위젯을 다시 그린다.
new IconButton(
icon: Icons.add,
onPressed: (){ // 이 콜백이 상태의 수량을 증가시키는 setState를 호출한다
setState((){
this.quantity++;
});
}
),
],
)
);
}
![](https://blog.kakaocdn.net/dn/b4qKL9/btsEFRwCCnP/t9qo0QhkHHaGrTeSjM8jG1/img.png)
- 페이지로 이동하면 플러터가 객체를 만들고 이 객체는 위젯과 관련된 State객체 생성
- 위젯이 마운트되면 플러터가 initState 호출
- 상태를 초기화하면 플러터가 위젯을 빌드하고 화면에 위젯을 그린다.
- 수량 위젯은 다음 세 가지 이벤트 중 하나를 기다린다.
- 사용자가 앱의 다른 화면으로 이동하며 폐기(dispose) 상태일 때
- 트리의 다른 위젯이 갱신되며 수량 위젯이 의존하는 설정이 바뀜. 위젯의 상태는 didUpdateWidget을 호출하며 필요하다면 위젯을 다시 그린다. 예를 들어 제품이 트리의 상위 위젯에서 해당 제품을 장바구니에 추가할 수 없도록 상태 위젯을 비활성화 하는 상황
- 사용자가 버튼을 눌러 setState를 호출해 위젯의 내부 상태가 갱신되어 플러터가 위젯을 다시 빌드하고 그리는 상황
- 사용자가 앱의 다른 화면으로 이동하며 폐기(dispose) 상태일 때
1.6 플러터 렌더링: 내부 동작 원리
위젯 트리
![](https://blog.kakaocdn.net/dn/HEnew/btsEIQjgYa6/hJv7DxggabpYzk2mlg55qk/img.png)
- 사용자가 버튼을 누른다.
- Button.onPressed 콜백에서 setState를 호출한다.
- Button의 상태가 dirty로 바뀌었기에 플러터는 이 위젯을 리빌드한다.
- 트리에서 기존 위젯을 새 위젯으로 바꾼다.
- 플러터가 새 트리를 그린다.
![](https://blog.kakaocdn.net/dn/bszBof/btsEGPLNXlJ/m8NkJEhNJbLRKkNBaTudf1/img.png)
1.6.1 위젯 트리와 레이아웃 조립
- 위젯 : 화면에 나타낼 요소를 결정하는 데이터와 설정
트리에서 버튼을 빌드할 때 실제로 특정 색깔(파란색) 사각형과 그 안의 텍스트를 빌드하는게 아닌 화면에 나타낼 요소의 설정을 처리할 뿐이다. - 위젯 트리가 완성되면 플러터는 레이아웃을 처리한다.
- 플러터는 필요할 때 트리를 한 차례 탐색한다(선형 시간 소요)
- 트리를 탐색하며 위젯의 위치정보를 수집한다.
- 레이아웃과 크기 제약(constraint)은 부모에서 자식 위젯 순으로 작성된다.
- 트리를 거슬러 올라오며 모든 위젯은 자신의 제약을 알고있는 상태이기에 싱제 크기와 위치를 부모 위젯에 알린다. 위젯은 서로의 관계를 정리하며 최종 레이아웃을 결정한다.
Example. 장바구니 예제
- QuantityWidget의 [+] 버튼을 누른다.
- 새로운 수량으로 상태가 변경된다.
- 플러터는 위젯 트리를 탐색하며 내려가는데, 이 때 QuantityWidget은 버튼과 텍스트 필드에 제약정보를 알려준다.
- 버튼은 [+], [-]아이콘에 이들의 제약을 알려주는 등의 순서로 트리를 타고 내려오며 정보를 전파한다.
- 단말 노드의 위젯에 도달하면 모든 위젯은 크기 제약 정보를 획득한 상태이다.
- 트리를 거슬러 올라가며 각 위젯의 크기와 위치를 안전하게 계산한다.
1.6.2 조립 과정
1.6.3 화면에 그리기
- 플러트는 리액티브다.
- 모든 것은 위젯이다.
- State 객체는 오래 살아남으며 종종 재사용된다.
- 위젯의 제약은 부모가 서술한다.
출처
https://catsbi.oopy.io/dbe067c8-0ff1-484a-ad34-8b9051c0b6d5
'flutter' 카테고리의 다른 글
[flutter] Flutter (2) - Dart 문법 (1) | 2024.02.11 |
---|