Study

34. Flutter GridView로 그리드 리스트 구현하기 | Flutter

구구 구구 2024. 8. 3. 11:00
반응형

이게 초현실주의?, dall-e

 

 

Flutter로 그리드 리스트 만들기: 초보자 가이드

 

01. 서론

Flutter에서 그리드 리스트의 필요성

Flutter는 크로스플랫폼 모바일 애플리케이션 개발을 위한 프레임워크로, 다양한 UI 구성 요소를 제공합니다. 그리드 리스트는 이미지 갤러리, 상품 목록, 아이콘 배열 등 다양한 용도로 활용될 수 있습니다. 그리드 형식은 사용자에게 많은 정보를 일목요연하게 제공하며, 시각적으로도 매력적인 레이아웃을 구성할 수 있습니다. 특히 쇼핑 앱이나 포토 갤러리 앱에서는 그리드 리스트가 자주 사용됩니다.

Flutter GridView의 기본 개념

GridView는 Flutter에서 그리드 형식의 리스트를 만들기 위해 사용하는 위젯입니다. 이 위젯은 여러 행과 열로 구성된 그리드 레이아웃을 제공합니다. GridView는 스크롤 가능한 그리드를 제공하여 많은 양의 데이터를 효율적으로 표시할 수 있습니다. GridView의 주요 생성자 중 하나인 `GridView.count()`는 열의 수를 지정하여 간단히 그리드를 생성할 수 있습니다.

02. GridView 기본 사용법

GridView 소개

GridView는 다양한 방식으로 구성할 수 있는 유연한 위젯입니다. `GridView.count()`, `GridView.extent()`, `GridView.builder()` 등 여러 생성자를 제공하여 개발자가 필요한 형태로 그리드를 구성할 수 있도록 합니다. GridView는 아이템을 열과 행으로 배치하여, 사용자가 한눈에 많은 정보를 확인할 수 있게 합니다.

GridView.count() 생성자 사용 방법

`GridView.count()`는 열의 개수를 지정하여 간단하게 그리드를 만들 수 있는 생성자입니다. `crossAxisCount` 속성을 사용하여 열의 수를 지정할 수 있으며, `children` 속성에 리스트 아이템을 추가하면 됩니다. 다음은 기본적인 예제 코드입니다.


import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('GridView Example'),
        ),
        body: GridView.count(
          crossAxisCount: 2,
          children: List.generate(100, (index) {
            return Center(
              child: Text(
                'Item $index',
                style: Theme.of(context).textTheme.headline6,
              ),
            );
          }),
        ),
      ),
    );
  }
}

이 코드는 2개의 열로 구성된 그리드를 생성하며, 각 셀에는 해당 인덱스 번호가 표시됩니다. `List.generate`를 사용하여 100개의 아이템을 생성하고, `children` 속성에 추가합니다.

 

03. 예제 코드

기본 예제 코드 설명

Flutter에서 그리드 리스트를 만드는 기본적인 예제 코드를 살펴보겠습니다. 이 예제는 `GridView.count()` 생성자를 사용하여 2개의 열로 구성된 그리드를 생성합니다. 각 셀에는 해당 인덱스 번호가 텍스트로 표시되며, 리스트는 세로로 스크롤할 수 있습니다.


import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('GridView Example'),
        ),
        body: GridView.count(
          crossAxisCount: 2,
          children: List.generate(100, (index) {
            return Center(
              child: Text(
                'Item $index',
                style: Theme.of(context).textTheme.headline6,
              ),
            );
          }),
        ),
      ),
    );
  }
}

이 코드는 매우 기본적인 그리드 리스트를 생성합니다. `crossAxisCount` 속성을 2로 설정하여 2개의 열을 만들고, `List.generate`를 사용하여 100개의 아이템을 생성합니다. 각 아이템은 중앙에 배치된 텍스트 위젯으로 구성됩니다.

다양한 컨테이너 색상 및 스타일 적용

기본 예제에서 각 셀의 스타일을 다양하게 적용하여 그리드를 더욱 매력적으로 만들 수 있습니다. 다음 예제는 각 셀에 다양한 배경색과 스타일을 적용한 코드입니다.


import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Styled GridView Example'),
        ),
        body: GridView.count(
          crossAxisCount: 2,
          children: List.generate(100, (index) {
            return Container(
              margin: EdgeInsets.all(4.0),
              decoration: BoxDecoration(
                color: Colors.primaries[index % Colors.primaries.length],
                borderRadius: BorderRadius.circular(8.0),
              ),
              child: Center(
                child: Text(
                  'Item $index',
                  style: TextStyle(color: Colors.white, fontSize: 18),
                ),
              ),
            );
          }),
        ),
      ),
    );
  }
}

이 예제에서는 `Container` 위젯을 사용하여 각 셀에 배경색과 모서리 반경을 적용했습니다. `Colors.primaries` 배열을 사용하여 다양한 색상을 순환하며 적용하고, `margin` 속성을 사용하여 각 셀 사이에 간격을 두었습니다. 각 셀의 텍스트는 중앙에 배치되고, 글자 색상과 크기를 지정하여 가독성을 높였습니다.

 

04. 고급 설정 및 커스터마이징

scrollDirection 속성 설정

GridView는 기본적으로 세로로 스크롤되지만, `scrollDirection` 속성을 사용하여 수평 스크롤로 변경할 수 있습니다. 다음 예제는 `scrollDirection` 속성을 `Axis.horizontal`로 설정하여 수평 스크롤 가능한 그리드를 생성합니다.


import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Horizontal GridView Example'),
        ),
        body: GridView.count(
          scrollDirection: Axis.horizontal,
          crossAxisCount: 2,
          children: List.generate(100, (index) {
            return Container(
              margin: EdgeInsets.all(4.0),
              decoration: BoxDecoration(
                color: Colors.primaries[index % Colors.primaries.length],
                borderRadius: BorderRadius.circular(8.0),
              ),
              child: Center(
                child: Text(
                  'Item $index',
                  style: TextStyle(color: Colors.white, fontSize: 18),
                ),
              ),
            );
          }),
        ),
      ),
    );
  }
}

이 예제는 `scrollDirection`을 `Axis.horizontal`로 설정하여 수평으로 스크롤되는 그리드를 생성합니다. 두 개의 행으로 구성된 그리드이며, 사용자는 가로로 스크롤하여 아이템을 볼 수 있습니다.

다양한 레이아웃 구성 방법

GridView는 다양한 레이아웃을 구성할 수 있는 유연성을 제공합니다. 예를 들어, `GridView.builder`를 사용하여 더 복잡한 그리드를 만들 수 있습니다. `GridView.builder`는 리스트 아이템을 동적으로 생성할 수 있어, 많은 양의 데이터를 효율적으로 처리할 수 있습니다.


import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('GridView.builder Example'),
        ),
        body: GridView.builder(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 3,
            mainAxisSpacing: 4.0,
            crossAxisSpacing: 4.0,
            childAspectRatio: 1.0,
          ),
          itemCount: 50,
          itemBuilder: (context, index) {
            return Container(
              decoration: BoxDecoration(
                color: Colors.primaries[index % Colors.primaries.length],
                borderRadius: BorderRadius.circular(8.0),
              ),
              child: Center(
                child: Text(
                  'Item $index',
                  style: TextStyle(color: Colors.white, fontSize: 18),
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

이 예제는 `GridView.builder`를 사용하여 3개의 열로 구성된 그리드를 만듭니다. `SliverGridDelegateWithFixedCrossAxisCount`를 사용하여 열의 수와 아이템 간 간격을 설정하고, `itemBuilder`를 통해 동적으로 아이템을 생성합니다.

 

05. 데스크탑 및 웹 브라우저에서의 사용

Shift 키를 사용한 수평 스크롤 방법

Flutter 애플리케이션을 데스크탑이나 웹 브라우저에서 실행할 때, 기본적으로 마우스 휠은 수직 스크롤에 사용됩니다. 그러나 수평으로 스크롤해야 하는 상황에서는 Shift 키를 사용할 수 있습니다. Shift 키를 누른 상태에서 마우스 휠을 움직이면 수평으로 스크롤됩니다. 이 기능은 수평 스크롤이 필요한 그리드 리스트나 가로형 스크롤 뷰를 탐색할 때 매우 유용합니다.


import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Shift Key Horizontal Scroll Example'),
        ),
        body: GridView.count(
          scrollDirection: Axis.horizontal,
          crossAxisCount: 2,
          children: List.generate(20, (index) {
            return Container(
              margin: EdgeInsets.all(4.0),
              color: Colors.primaries[index % Colors.primaries.length],
              child: Center(
                child: Text(
                  'Item $index',
                  style: TextStyle(color: Colors.white, fontSize: 18),
                ),
              ),
            );
          }),
        ),
      ),
    );
  }
}

이 예제는 `scrollDirection` 속성을 `Axis.horizontal`로 설정하여 수평 스크롤을 가능하게 합니다. 데스크탑이나 웹 브라우저에서 실행 시 Shift 키를 눌러 수평으로 스크롤할 수 있습니다.

웹 및 데스크탑 환경에서의 구현 주의사항

웹 및 데스크탑 환경에서 그리드 리스트를 구현할 때 몇 가지 주의사항이 있습니다.

  • 브라우저 호환성: 모든 브라우저가 동일한 방식으로 동작하지 않을 수 있습니다. 다양한 브라우저에서 테스트를 진행하여 호환성을 확인하는 것이 중요합니다.
  • 화면 크기 및 해상도: 데스크탑과 웹 브라우저는 다양한 화면 크기와 해상도를 가지고 있습니다. 반응형 디자인을 고려하여 그리드 리스트가 모든 화면에서 적절히 표시되도록 해야 합니다.
  • 성능 최적화: 많은 양의 데이터를 표시할 때는 성능 최적화가 필요합니다. Lazy loading과 같은 기술을 사용하여 성능을 향상시킬 수 있습니다.
  • 스크롤 동작: 웹 브라우저와 데스크탑에서는 스크롤 동작이 모바일 환경과 다를 수 있습니다. Shift 키를 사용한 수평 스크롤이나 마우스 휠의 민감도를 고려하여 사용자 경험을 최적화해야 합니다.

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Responsive GridView Example'),
        ),
        body: LayoutBuilder(
          builder: (context, constraints) {
            return GridView.builder(
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: (constraints.maxWidth < 600) ? 2 : 4,
                mainAxisSpacing: 4.0,
                crossAxisSpacing: 4.0,
                childAspectRatio: 1.0,
              ),
              itemCount: 50,
              itemBuilder: (context, index) {
                return Container(
                  decoration: BoxDecoration(
                    color: Colors.primaries[index % Colors.primaries.length],
                    borderRadius: BorderRadius.circular(8.0),
                  ),
                  child: Center(
                    child: Text(
                      'Item $index',
                      style: TextStyle(color: Colors.white, fontSize: 18),
                    ),
                  ),
                );
              },
            );
          },
        ),
      ),
    );
  }
}

이 예제는 `LayoutBuilder`를 사용하여 화면 크기에 따라 열의 수를 조정하는 반응형 그리드를 구현합니다. 작은 화면에서는 2개의 열로, 큰 화면에서는 4개의 열로 구성됩니다.

 

06. 결론

그리드 리스트 사용의 장점

그리드 리스트는 사용자 인터페이스를 구성할 때 매우 유용한 도구입니다. 특히 이미지 갤러리, 제품 목록, 아이콘 배열 등 다양한 용도로 활용될 수 있습니다. 그리드 리스트의 주요 장점은 다음과 같습니다.

  • 화면 공간의 효율적 사용: 그리드를 사용하면 화면의 공간을 효율적으로 사용할 수 있습니다. 많은 양의 데이터를 한눈에 확인할 수 있어 사용자가 쉽게 정보를 탐색할 수 있습니다.
  • 시각적 매력: 다양한 스타일링 옵션을 통해 시각적으로 매력적인 인터페이스를 구현할 수 있습니다. 배경색, 모서리 반경, 간격 등을 조정하여 세련된 디자인을 만들 수 있습니다.
  • 다양한 레이아웃 구성: GridView를 사용하면 다양한 레이아웃을 쉽게 구성할 수 있습니다. 열의 수, 행의 수, 스크롤 방향 등을 유연하게 조정할 수 있어 다양한 요구사항을 만족시킬 수 있습니다.

추가 리소스 및 학습 자료

Flutter에서 그리드 리스트를 만드는 방법에 대해 더 깊이 학습하고 싶다면 아래의 리소스를 참고하세요.

이 리소스들을 활용하여 Flutter에서 그리드 리스트를 더욱 효율적으로 구현하고, 다양한 사용자 인터페이스를 제작해보세요.


관련된 다른 글도 읽어보시길 추천합니다

 

2024.07.28 - [Study] - 29. Flutter에서 자주 사용하는 위젯 소개 및 활용법 | Flutter

 

29. Flutter에서 자주 사용하는 위젯 소개 및 활용법 | Flutter

Flutter Widget Catalog: 기본부터 고급까지 완벽 가이드 01. 기본 위젯1) 기본적으로 알아야 할 위젯Flutter에서 기본 위젯은 앱 개발에 필수적인 요소들로, 모든 Flutter 앱에서 사용됩니다. 이러한 위젯

guguuu.com

2024.07.25 - [Study] - 28. Flutter로 사용자 인터페이스 구축하기 | Flutter

 

28. Flutter로 사용자 인터페이스 구축하기 | Flutter

Flutter로 사용자 인터페이스 구축하기: 기본 가이드 01. 서론1) Flutter의 인기와 장점Flutter는 Google에서 개발한 오픈 소스 UI 소프트웨어 개발 키트(SDK)입니다. Flutter의 가장 큰 장점 중 하나는 한 번

guguuu.com

2024.07.24 - [Study] - 27. Windows에서 Flutter로 Android 앱 개발 시작하기: 단계별 가이드 | Flutter

 

27. Windows에서 Flutter로 Android 앱 개발 시작하기: 단계별 가이드 | Flutter

Windows에서 Flutter로 Android 앱 개발 시작하기: 단계별 가이드 01. 서론1) Flutter와 Windows 환경에서의 개발Flutter는 Google에서 개발한 오픈소스 UI 소프트웨어 개발 키트로, 단일 코드베이스를 통해 iOS, A

guguuu.com


읽어주셔서 감사합니다

공감은 힘이 됩니다

 

:)

반응형