화면에 글자를 표시할 때 사용하는 기본 위젯
간단한 문자열부터 다양한 스타일, 정렬, 줄 수 조절까지 지원
const Text(
String this.data, {
super.key,
this.style,
this.strutStyle,
this.textAlign,
this.textDirection,
this.locale,
this.softWrap,
this.overflow,
(
'Use textScaler instead. '
'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '
'This feature was deprecated after v3.12.0-2.0.pre.',
)
this.textScaleFactor,
this.textScaler,
this.maxLines,
this.semanticsLabel,
this.textWidthBasis,
this.textHeightBehavior,
this.selectionColor,
})
style: 텍스트 스타일 설정 (크기, 색상, 굵기 등)
textAlign: 텍스트 정렬 (left, right, center 등)
maxLines: 최대 줄 수 제한
overflow: 넘치는 텍스트 처리 (예: TextOverflow.ellipsis)
// 스타일 없이 기본 사용
Text("안녕하세요")
Text(
'제목입니다',
// 폰트 스타일 적용
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.blue,
),
// 정렬. TextAlign enum 사용
// (열거형)은 고정된 수의 상수 값들을 나타내는 특별한 종류의 클래스
align: TextAlign.center,
overflow: TextOverflow.ellipsis,
maxLines: 1,
)
이미지를 앱에 표시할 때 사용하는 위젯
// 기본 생성자
// image 속성에 AssetImage, NetworkImage 등 객체 사용
Image(image: NetworkImage('https://picsum.photos/200/300'));
// 네트워크 이미지 - 인터넷에서 이미지 불러오기
// Image 기본생성자(위)를 편하게 사용가능
Image.network('https://picsum.photos/200/300');
// 에셋 이미지(프로젝트 내 정적 이미지) 사용
// 에셋 이미지는 프로젝트 내 이미지 넣고 pubspec.yaml에
// 에셋 이미지가 있는 경로 추가해주어야함
Image.asset('assets/test.png');
// 파일 이미지 - 기기 내부 저장소에서 이미지 불러오기(예: 다운로드 폴더, 갤러리 사진 등)
Image.file(File('휴대폰 저장소 내 경로'));
명시적으로 필요한 파일만 포함함으로써 앱의 용량을 줄이고, 불필요한 리소스 포함을 방지
Image.asset('assets/sample.png')
fit: 이미지 비율 및 맞춤 (BoxFit.cover, contain, fill 등)
width, height: 이미지 크기 지정
Flutter에서 제공하는 기본 아이콘을 표시하는 데 사용
// IconData 를 생성자의 첫번째 파라미터로 전달
// 직접 IconData 객체를 만들어서 사용할 일은 없고
// Icons 클래스 내 정의된 정적 멤버변수 사용
// Icon(Icons.star)
class Icon extends StatelessWidget {
/// Creates an icon.
const Icon(
this.icon, {
super.key,
...
클래스가 생성되지 않아도 접근 가능한 변수
프로그램 시작시 부터 종료시 까지 존재
https://api.flutter.dev/flutter/material/Icons-class.html
https://api.flutter.dev/flutter/cupertino/CupertinoIcons-class.html
CupertinoIcons 는 iOS 스타일 아이콘
리엑트 아이콘같은 느낌
icon: 표시할 아이콘 종류 (Icons.camera, Icons.home 등)
color: 아이콘 색상
size: 아이콘 크기
자식 위젯들을 세로(수직) 방향으로 나열하는 레이아웃 위젯
children : 배치할 위젯들의 리스트 정의
mainAxisAlignment: 수직 방향 정렬 (start, center, spaceBetween 등)
start: 위쪽 정렬
end: 아래쪽 정렬
center: 수직 가운데 정렬
spaceBetween: 위젯들 사이에 동일한 간격을 배치하고, 양 끝에는 간격 없음
spaceAround: 위젯들 사이에 동일한 간격을 배치하고, 첫 번째 위젯 앞과 마지막 위젯 뒤에는 그 간격의 절반만큼 배치
spaceEvenly: 모든 위젯과 위젯 사이, 그리고 처음과 끝에도 동일한 간격을 배치
crossAxisAlignment: 수평 정렬 (start, center, stretch 등)
start: 왼쪽 정렬
end: 오른쪽 정렬
center: 수평 가운데 정렬
stretch: 위젯들이 교차 축 방향으로 가능한 공간을 모두 채우도록 확장
자식 위젯들을 가로(수평) 방향으로 나열하는 레이아웃 위젯
children : 배치할 위젯들의 리스트 정의
mainAxisAlignment: 수평 방향 정렬 (start, center, spaceBetween 등)
start: 왼쪽 정렬
end: 오른쪽 정렬
center: 수평 가운데 정렬
spaceBetween: 위젯들 사이에 동일한 간격을 배치하고, 양 끝에는 간격 없음
spaceAround: 위젯들 사이에 동일한 간격을 배치하고, 첫 번째 위젯 앞과 마지막 위젯 뒤에는 그 간격의 절반만큼 배치
spaceEvenly: 모든 위젯과 위젯 사이, 그리고 처음과 끝에도 동일한 간격을 배치
crossAxisAlignment: 수직 정렬 (start, center, stretch 등)
start: 위쪽 정렬
end: 아래쪽 정렬
center: 수직 가운데 정렬
stretch: 위젯들이 교차 축 방향으로 가능한 공간을 모두 채우도록 확장
자식 위젯 하나를 스크롤 가능하도록 만드는 위젯
Column이나 Row 안의 내용이 화면보다 클 때 overflow를 방지하고 스크롤 가능하게 만듬Column과 함께 사용child: 스크롤 할 위젯 배치
scrollDirection: 스크롤 방향 설정 (기본: Axis.vertical)
SingleChildScrollView(
// Axis.vertical 또는 Axis.horizontal. 기본값 vertical
// scrollDirection: Axis.vertical,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Image.network('https://picsum.photos/200/300', fit: BoxFit.cover),
Image.network('https://picsum.photos/200/300', fit: BoxFit.cover),
Image.network('https://picsum.photos/200/300', fit: BoxFit.cover),
],
),
고정된 너비(width)와 높이(height)를 갖는 박스를 생성하는 위젯
width, height: 너비와 높이를 지정
child: SizedBox 내부에 위치할 자식 위젯
// 간격 만들기
SizedBox(height: 20)
// 고정 크기 안에 위젯 배치
SizedBox(
width: 200,
height: 100,
child: ElevatedButton(onPressed: (){}, child: Text('Hi')),
)
// 고정 크기 안에 위젯 배치
SizedBox(
width: double.infinity, // 무한히 확대하겠다는 의미!
height: 100,
child: ElevatedButton(onPressed: (){}, child: Text('Hi')),
)
SizedBox + 레이아웃, 스타일, 정렬 등 다양한 기능을 가진 다목적 위젯
padding, margin, color, alignment, decoration 등 UI 스타일 설정 가능
크기가 지정되지 않으면 부모위젯의 크기를 물려받음
Container(
width: 200,
height: 100,
padding: EdgeInsets.all(20),
margin: EdgeInsets.all(10),
decoration: BoxDecoration(
color: Colors.blue,
border: Border.all(color: Colors.green, width: 10),
borderRadius: BorderRadius.circular(20),
),
child: Container(color: Colors.black),
)
width, height : 컨테이너의 너비와 높이를 지정
color : 배경색 설정 (⭐️ 단독 사용 시 decoration과 함께 사용할 수 없음)
padding : 자식 위젯 내부 여백 (내용과 테두리 사이 공간)
margin : 외부 여백 (Container 자신과 바깥 위젯 사이의 공간)
alignment : 자식 위젯의 정렬 위치를 지정합니다.
decoration :
→ 배경, 테두리, 그림자, 둥근 모서리 등 스타일을 설정합니다.
→ 예: BoxDecoration(borderRadius: BorderRadius.circular(8)) child
→ Container 내부에 위치할 단일 자식 위젯입니다.
→ 예: child: Text('Hello')
단순히 공간을 만들거나 위젯의 크기만 지정할 때
스타일, 패딩, 정렬이 필요 없고 간단한 간격만 줄 때
예: 위젯 사이에 height: 16 간격 만들기
크기뿐 아니라 스타일링이 필요한 경우
배경색(color), 모서리 둥글게(borderRadius), 그림자(boxShadow) 등
padding, margin, 정렬, decoration 등 다양한 속성을 써야 할 때
복합적인 UI를 꾸밀 때 필수
padding 만 사용 시 Padding 이라는 위젯도 사용가능
Container는 여러가지 기능을 제공하기 때문에 SizedBox에 비해서 성능적으로는 좋지 않음
Row, Column 내에서 남은 공간을 차지하도록 자식 위젯을 확장해주는 위젯
Row(
children: [
Expanded(flex: 2, child: Container(color: Colors.red)),
Expanded(flex: 1, child: Container(color: Colors.blue)),
],
)

Expanded 와 동일하나 자녀위젯은 가지지 못함
여러 위젯을 겹쳐서 배치할 수 있는 위젯
Stack(
children: [
Container(width: 200, height: 200, color: Colors.green),
Container(width: 150, height: 150, color: Colors.blue),
Container(width: 100, height: 100, color: Colors.yellow),
Positioned(
right: 10,
bottom: 10,
child: Container(width: 50, height: 50, color: Colors.blueGrey),
),
],
)
Stack(
children: [
Align(
alignment: Alignment.centerRight,
child: Text('정렬'),
),
],
)
Center(child: Text('정렬'))
void onButtonClick(){
print("버튼 터치됨");
}
...
ElevatedButton(
// 버튼의 스타일은 ElevatedButton.styleFrom 메서드로 정의 가능
// 중요 파라미터
// - backgroundColor : 배경색
// - foregroundColor : 전경색 (글자, Icon)
// - shape : 모양. 주로 RoundedRectangleBorder 클래스를 통해 모서리 둥글기만 수정
style: ElevatedButton.styleFrom(
backgroundColor: Colors.red,
foregroundColor: Colors.black,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
onPressed: onButtonClick,
child: Text('data'),
)
이름이 없는 함수
딱 한 번만 쓸 함수를 작성할 때 유용
이벤트 콜백(onPressed 등)과 같은 곳에 짧은 동작을 실행할 때 사용
void onButtonClick(){
print("버튼 터치됨");
}
ElevatedButton(
onPressed: onButtonClick,
child: Text('data'),
)
ElevatedButton(
onPressed: () {
print("버튼 터치됨")
},
child: Text('data'),
)
사용자의 터치, 제스처(탭, 더블탭, 스와이프 등) 를 감지하여 반응하는 위젯
모든 시각적 요소를 클릭 가능하게 만들고 싶을 때 사용
GestureDetector(
onTap: () {
print("이미지 터치됨");
},
onDoubleTap: () {
print("이미지 두번 터치됨");
},
onLongPress: () {
print("이미지 길게 터치됨");
},
child: Image.network('https://picsum.photos/200/300'),
)
| 기능/역할 | 대표 위젯들 | 설명 |
|---|---|---|
| 앱 뼈대 구성 | MaterialApp, Scaffold, AppBar | 앱의 기본 구조와 상단 앱바 설정 |
| 기본 출력 요소 | Text, Image, Icon | 텍스트, 이미지, 아이콘 출력 |
| 1열/1행 배치 | Column, Row | 자식 위젯들을 수직/수평으로 나열 |
| 간격/크기 조절 | SizedBox, Container, Padding | 크기 지정, 여백 추가, 배경 및 정렬 |
| 공간 분할 | Expanded, Spacer | 남은 공간을 유연하게 분할하거나 비워둠(Column, Row 내에서만) |
| 겹치기/정렬 | Stack, Positioned, Align, Center | 위젯을 겹치거나 원하는 위치로 배치 |
| 입력/반응 처리 | GestureDetector, ElevatedButton | 클릭, 제스처 입력 등 사용자 상호작용 처리 |
html이랑 구성 방식은 다르지만 사용하는 용어는 비슷한 것 같다.
기본 위젯에 대한 강의가 끝났는데 빨리 심화 과정으로 넘어가서
화면 구성을 해보고 싶다