위젯
- 현재 주어진 상태를 기반으로 어떤 UI를 구현할지 정의
- 상태가 변경되면 변경 사항에 알맞게 변경된 UI를 화면에 다시 그려줌.
- 결과적으로 플러터는 최소한의 리소스를 이용해 120FPS 까지 퍼포먼스 발생
자식 하나만을 가지는 (child) 대표적인 위젯
- Container 위젯 : 자식을 담는 컨테이너 역할을 함.
ㄴ 다만, 단순하게 자식을 담는 역할을 하는게 아니라 배경색, 너비와 높이, 테두리 등의 디자인 지정
- GestureDetector 위젯 : 제스처 기능을 자식 위젯에서 인식하는 위젯
ㄴ 탭이나 드래그, 더블 클릭 같은 제스처 기능이 인식됐을 때 함수 실행 가능
- SizedBox 위젯 : 높이와 너비 지정하는 위젯
ㄴ Container 위젯과 다르게 디자인적 요소는 적용할 수 없고 const 생성자로 선언할 수 있어서 퍼포먼스 측에서 더 효율적
다수의 자식을 입력할 수 있는 (childeren) 대표적인 위젯
- Column 위젯 : children 매개변수에 입력된 모든 위젯들을 세로로 배치
- Row 위젯 : children 매개변수에 입력된 모든 위젯들을 가로로 배치
- ListView 위젯 : 리스트를 구현할 때 사용
ㄴ 입력된 위젯이 화면을 벗어나게 되면 스크롤이 가능해짐
위젯 계층 예시
chatgpt에게 물어본 결과, 이렇게 작성된다고 한다.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Column(
children: [
// 상단 큰 사각형 (화면 부분)
Expanded(
child: Container(
color: Colors.blueGrey[50], // 배경색 설정
),
),
// 하단 버튼들
Container(
color: Colors.grey[300], // 버튼 영역의 배경색
padding: EdgeInsets.symmetric(vertical: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// "앞으로" 버튼
Column(
children: [
Icon(Icons.arrow_left, size: 40.0),
Text("앞으로"),
],
),
// "뒤로" 버튼
Column(
children: [
Icon(Icons.arrow_right, size: 40.0),
Text("뒤로"),
],
),
// "홈" 버튼
Column(
children: [
Icon(Icons.home, size: 40.0),
Text("홈"),
],
),
],
),
),
],
),
),
);
}
}
Row와 Column 위젯이 헷갈려서, 반대로 해봤더니 아이콘 모양이 바뀐다.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Column(
children: [
// 상단 큰 사각형 (화면 부분)
Expanded(
child: Container(
color: Colors.blueGrey[50], // 배경색 설정
),
),
// 하단 버튼들
Container(
color: Colors.grey[300], // 버튼 영역의 배경색
padding: EdgeInsets.symmetric(vertical: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// "앞으로" 버튼
Row(
children: [
Icon(Icons.arrow_left, size: 40.0),
Text("앞으로"),
],
),
// "뒤로" 버튼
Row(
children: [
Icon(Icons.arrow_right, size: 40.0),
Text("뒤로"),
],
),
// "홈" 버튼
Row(
children: [
Icon(Icons.home, size: 40.0),
Text("홈"),
],
),
],
),
),
],
),
),
);
}
}
참고로 공식문서에서는 다음과 같이 설명한다.
반응형
'스터디 > [코드팩토리의 플러터 프로그래밍] (2024)' 카테고리의 다른 글
[코드팩토리의 플러터 프로그래밍] 7장. 앱을 만들려면 알아야 하는 그 밖의 지식 - 플러터 플로우, 폴더 구조, 플러그인 (0) | 2024.08.20 |
---|---|
[코드팩토리의 플러터 프로그래밍] 6장. 기본 위젯 알아보기 - 위젯 종류 (0) | 2024.08.19 |
[코드팩토리의 플러터 프로그래밍] 5장. 플러터 입문하기 - hello code factory 출력, center위젯으로 중앙 정렬 (0) | 2024.08.11 |
[코드팩토리의 플러터 프로그래밍] 5장. 플러터 입문하기 - 프로젝트 생성하기, 안드로이드 애뮬레이터 추가하기 (0) | 2024.08.10 |
[코드팩토리의 플러터 프로그래밍] 4장. 다트 3.0 신규 문법 (3) | 2024.07.21 |