기초
레이아웃
Row, Column, Stack, Expanded, ListView로 화면 구조를 만듭니다.
개념 먼저 보기
레이아웃의 기본 개념부터 잡기
레이아웃 문서는 먼저 용어의 뜻을 잡고, 그 다음 Flutter 코드에서 어디에 쓰이는지 연결해서 읽는 것이 좋습니다.
아래 항목들은 이 문서에서 다루는 내용을 작은 단위로 나눈 것입니다. 각 항목을 읽은 뒤 예제를 보면 코드가 훨씬 덜 추상적으로 느껴집니다.
종류별로 하나씩
레이아웃에서 나눠 볼 핵심 요소
축과 정렬
Row는 가로 방향, Column은 세로 방향으로 자식을 배치합니다.
언제 쓰나: mainAxisAlignment는 주축 정렬, crossAxisAlignment는 교차축 정렬을 제어합니다.
Flutter에서: Padding과 SizedBox는 여백과 고정 크기를 표현할 때 자주 씁니다.
// 레이아웃 예제입니다.
// 먼저 코드의 큰 흐름을 보고, 주석을 따라 각 줄의 역할을 확인하세요.
Row(
children: const [
Icon(Icons.book),
SizedBox(width: 8),
Expanded(child: Text('Flutter layout')),
],
)
공간 분배
Expanded는 남는 공간을 채우도록 자식 크기를 조정합니다.
언제 쓰나: Flexible은 자식이 더 유연하게 공간을 차지하게 합니다.
Flutter에서: ListView.builder는 긴 목록을 효율적으로 렌더링합니다.
// 레이아웃 예제입니다.
// 먼저 코드의 큰 흐름을 보고, 주석을 따라 각 줄의 역할을 확인하세요.
Row(
children: const [
Icon(Icons.book),
SizedBox(width: 8),
Expanded(child: Text('Flutter layout')),
],
)
부연 설명
축과 정렬
- Row는 가로 방향, Column은 세로 방향으로 자식을 배치합니다.
- mainAxisAlignment는 주축 정렬, crossAxisAlignment는 교차축 정렬을 제어합니다.
- Padding과 SizedBox는 여백과 고정 크기를 표현할 때 자주 씁니다.
부연 설명
공간 분배
- Expanded는 남는 공간을 채우도록 자식 크기를 조정합니다.
- Flexible은 자식이 더 유연하게 공간을 차지하게 합니다.
- ListView.builder는 긴 목록을 효율적으로 렌더링합니다.
깊게 이해하기
Flutter 레이아웃은 부모가 제약을 내려보내고 자식이 크기를 정한 뒤 부모가 위치를 정하는 방식으로 이해하면 쉽습니다.
Row와 Column에서 overflow가 나는 이유는 대개 자식이 가질 수 있는 최대 너비를 제한하지 않았기 때문입니다. Expanded나 Flexible은 이런 문제를 해결하는 대표 도구입니다.
상세 예제
텍스트가 길어도 넘치지 않는 목록 타일 레이아웃 예제입니다.
Row(
children: [
const Icon(Icons.article),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
Text('긴 문서 제목도 안전하게 표시됩니다.'),
Text('Expanded가 남은 너비를 제한합니다.'),
],
),
),
],
)
실무에서 주의할 점
- Row 안의 긴 Text에는 Expanded를 자주 함께 사용합니다.
- 스크롤이 필요한 화면에는 Column보다 ListView나 CustomScrollView를 고려하세요.
- MediaQuery보다 LayoutBuilder가 컴포넌트 단위 반응형에 더 적합할 때가 많습니다.
실습 체크리스트
Row/Column 사용Expanded로 공간 채우기ListView 목록 만들기