플러터(Flutter)는 하나의 코드베이스로 iOS, Android, Web까지 동시에 빌드할 수 있는 크로스 플랫폼 프레임워크입니다.
그중에서도 **플러터 그리드 위젯(GridView)**은 격자형 형태의 레이아웃을 간단하게 구성할 수 있는 핵심 도구죠.
리스트뷰(ListView)가 세로 방향의 단일 리스트라면, 그리드 위젯은 가로와 세로로 아이템을 동시에 배치할 수 있는 강력한 위젯입니다.
예를 들어 쇼핑몰 앱의 상품 목록, 포토 갤러리, 카드형 뉴스 피드 등을 만들 때 바로 이 GridView가 사용됩니다.
플러터의 GridView는 여러 형태로 제공됩니다.
기본적으로 다음 네 가지 방식으로 사용할 수 있습니다.
이 중 가장 많이 사용되는 건 count와 builder입니다.
가장 간단한 형태의 플러터 그리드 위젯은 GridView.count입니다.
다음 예시는 한 줄에 2개의 아이템이 표시되도록 설정합니다.
GridView.count(
crossAxisCount: 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
padding: EdgeInsets.all(8),
children: List.generate(6, (index) {
return Container(
color: Colors.blueAccent,
child: Center(
child: Text(
'아이템 $index',
style: TextStyle(color: Colors.white),
),
),
);
}),
);
💡 Tip:
crossAxisSpacing과mainAxisSpacing은 아이템 간의 간격을 설정합니다.crossAxisCount값이 2이면 2열 구조의 그리드가 만들어집니다.
데이터 수가 많거나 API를 통해 비동기적으로 데이터를 가져올 때는 GridView.builder가 가장 적합합니다.
이 위젯은 스크롤할 때 필요한 부분만 렌더링하므로 성능이 매우 뛰어납니다.
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 8,
mainAxisSpacing: 8,
),
itemCount: 30,
itemBuilder: (context, index) {
return Card(
color: Colors.teal,
child: Center(
child: Text(
'Item $index',
style: TextStyle(color: Colors.white),
),
),
);
},
);
🔥 성능 팁:
builder방식은 스크롤 중 보이지 않는 위젯은 제거하고 다시 생성하기 때문에 메모리 사용량이 매우 효율적입니다.
GridView.extent는 항목의 최대 너비를 기준으로 자동으로 열 개수를 결정합니다.
이 방식은 다양한 화면 크기에서 반응형 디자인을 구현할 때 매우 유용합니다.
GridView.extent(
maxCrossAxisExtent: 150,
children: List.generate(12, (index) {
return Container(
color: Colors.orangeAccent,
child: Center(child: Text('Box $index')),
);
}),
);
📱 장점: 기기의 화면 폭에 따라 자동으로 아이템 개수가 조정되어 반응형 레이아웃에 이상적입니다.
플러터의 CustomScrollView 안에서 그리드를 사용할 때는 SliverGrid를 활용할 수 있습니다.
이 위젯은 복잡한 스크롤 동작(예: 상단 헤더 고정, 섹션 구분)을 만들 때 매우 유용합니다.
CustomScrollView(
slivers: [
SliverAppBar(
floating: true,
title: Text('SliverGrid Example'),
),
SliverGrid(
delegate: SliverChildBuilderDelegate(
(context, index) => Container(
color: Colors.blueGrey,
child: Center(child: Text('Item $index')),
),
childCount: 20,
),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
),
),
],
);
플러터 그리드 위젯을 사용할 때는 단순히 아이템을 나열하는 것보다 화면 크기 변화에 대응하는 레이아웃 설계가 중요합니다.
int getCrossAxisCount(BuildContext context) {
double width = MediaQuery.of(context).size.width;
if (width > 1200) return 5;
if (width > 800) return 3;
return 2;
}
이처럼 기기 폭에 따라 열 개수를 조정하면, 웹/태블릿/모바일 환경에서도 깔끔한 레이아웃을 유지할 수 있습니다.
다음은 실제 프로젝트에서 자주 사용되는 그리드 이미지 갤러리 예제입니다.
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 4,
mainAxisSpacing: 4,
),
itemCount: imageList.length,
itemBuilder: (context, index) {
return Image.network(
imageList[index],
fit: BoxFit.cover,
);
},
);
🖼️ 이미지 alt 예시 (SEO용)
<img src="grid-example.jpg" alt="플러터 그리드 위젯 예제 화면">
GridView.builder를 기본으로 활용하고, 불필요한 rebuild를 줄이세요.ListView와 함께 사용할 때는 shrinkWrap: true를 고려하세요.| 항목 | 설명 |
|---|---|
| 가독성 | 직관적 코드로 복잡한 레이아웃 구현 가능 |
| 성능 | Lazy loading으로 메모리 효율적 |
| 반응형 | 화면 크기에 따라 자동 조정 |
| 확장성 | SliverGrid 등으로 다양한 커스터마이징 가능 |
플러터 그리드 위젯은 UI 효율성과 디자인 완성도를 동시에 높일 수 있는 위젯입니다.GridView.count로 간단한 격자를 만들고, GridView.builder로 대용량 데이터를 처리하며,
필요할 경우 SliverGrid를 이용해 복잡한 화면 구성까지 가능합니다.
이제 여러분의 Flutter 프로젝트에서도 그리드 기반 반응형 UI를 적용해 보세요.
한층 완성도 높은 앱 디자인이 가능합니다!
Aluminium OS - Android가 PC로 향하는 이유와 의미 2025년 말, 구글이 내부 코드명 “Aluminium”로 불리는…
1. 2026년 기준중위소득이란? 2026년 기준중위소득은 대한민국 전체 가구의 중간 소득을 의미하며, 정부의 다양한 복지사업과 지원제도의…
월드컵 2포트 진입, 왜 이렇게 중요한가? 한국 축구 대표팀이 월드컵 2포트 진입을 목표로 국제 A매치를…
플러터 스키아 엔진 완전 이해: 왜 플러터는 스키아로 초고속 UI를 구현할까 플러터(Flutter)는 단 하나의 코드베이스로…
Flutter 생명주기란 무엇인가? **Flutter 생명주기(Lifecycle)**란, 앱 실행 중 위젯이 생성되고 사라지기까지의 전 과정을 의미합니다.즉, Flutter…
1. 사건 개요 — 연세대 중간고사에서 벌어진 AI 컨닝 2025년 11월 초, 연세대학교 신촌캠퍼스의 한…