반응형

 

Flutter에서 버튼은 다양한 스타일과 기능을 제공하는 UI 요소로, 사용자와의 상호작용을 위해 사용됩니다.

주요 버튼 위젯으로는 ElevatedButton, TextButton, OutlinedButton, 그리고 IconButton 등이 있습니다.

각 버튼 위젯은 특정 상황에 맞게 사용될 수 있습니다.

 

주요 버튼 위젯

 

1. ElevatedButton

2. TextButton

3. OutlinedButton

4. IconButton

5. FloatingActionButton

 

1. ElevatedButton

 

ElevatedButton은 입체적인 디자인을 가진 버튼으로, 주로 액션을 강조할 때 사용됩니다.

 

주요 속성

 

onPressed: 버튼이 클릭되었을 때 실행될 콜백 함수.

child: 버튼 내에 표시될 위젯 (일반적으로 텍스트).

style: 버튼의 스타일을 정의합니다.

style: ElevatedButton.styleFrom(
          primary: Colors.blue,
          onPrimary: Colors.white,
          padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15),
        ),

 

2. TextButton

 

TextButton은 텍스트만 있는 버튼으로, 보통 중요하지 않은 액션이나 링크를 나타낼 때 사용됩니다.

 

주요 속성

 

onPressed: 버튼이 클릭되었을 때 실행될 콜백 함수.

child: 버튼 내에 표시될 위젯 (일반적으로 텍스트).

style: 버튼의 스타일을 정의합니다.

style: TextButton.styleFrom(
          primary: Colors.blue,
          padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15),
        ),

 

3. OutlinedButton

 

OutlinedButton은 테두리가 있는 버튼으로, 보통 중요도가 낮은 액션이나 보조적인 작업을 나타낼 때 사용됩니다.

 

주요 속성

 

onPressed: 버튼이 클릭되었을 때 실행될 콜백 함수.

child: 버튼 내에 표시될 위젯 (일반적으로 텍스트).

style: 버튼의 스타일을 정의합니다.

style: OutlinedButton.styleFrom(
          primary: Colors.blue,
          side: BorderSide(color: Colors.blue),
          padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15),
        ),

 

 

 

body: Container(
  child: Column(
    children: [
      Center(
        child: ElevatedButton(
          style: ElevatedButton.styleFrom(
            backgroundColor: Colors.yellow
          ),
          onPressed: () => print("ElevatedButton"),
          child: const Text("ElevatedButton"),
        ),
      ),
      Center(
        child: TextButton(
          onPressed: () => print("TextButton"),
          child: const Text("TextButton"),
        ),
      ),
      Center(
        child: OutlinedButton(
          onPressed: () => print("OutlinedButton"),
          child: const Text("OutlinedButton"),
        ),
      )
    ],
  ),
)

 

4. IconButton

 

IconButton은 아이콘을 표시하는 버튼으로, 주로 툴바나 내비게이션 바에 사용됩니다.

 

주요 속성

 

icon: 버튼 내에 표시될 아이콘.

onPressed: 버튼이 클릭되었을 때 실행될 콜백 함수.

tooltip: 버튼에 마우스를 올렸을 때 표시될 툴팁.

IconButton(
      icon: Icon(Icons.search),
      onPressed: () {
        print('Search button clicked');
      },
      tooltip: 'Search',
    ),

 

 

5. FloatingActionButton

 

FloatingActionButton은 떠 있는 액션 버튼으로, 화면의 주요 액션을 나타내는 데 사용됩니다.

 

주요 속성

 

onPressed: 버튼이 클릭되었을 때 실행될 콜백 함수.

child: 버튼 내에 표시될 위젯 (일반적으로 아이콘).

floatingActionButton: FloatingActionButton(
          onPressed: () {
            print('FloatingActionButton clicked');
          },
          child: Icon(Icons.add),
          backgroundColor: Colors.blue,
        ),

 

 

 

주요 포인트

 

ElevatedButton: 입체적이고 주요 액션을 강조하는 버튼입니다.

TextButton: 텍스트만 있는 버튼으로, 중요하지 않은 액션이나 링크를 나타낼 때 사용합니다.

OutlinedButton: 테두리가 있는 버튼으로, 보조적인 작업을 나타낼 때 사용됩니다.

IconButton: 아이콘을 표시하는 버튼으로, 툴바나 내비게이션 바에 사용됩니다.

FloatingActionButton: 주요 액션을 나타내는 떠 있는 버튼입니다.

반응형
반응형

Gradient는 Flutter에서 다양한 색상 변화를 적용할 수 있는 도구입니다.

Gradient 클래스를 사용하면 위젯에 부드러운 색상 전환 효과를 줄 수 있습니다.

Gradient의 주요 형태는 선형 그라디언트 (LinearGradient), 방사형 그라디언트 (RadialGradient), 그리고 대각선 그라디언트 (SweepGradient)가 있습니다.

 

주요 Gradient 종류

 

1. LinearGradient

2. RadialGradient

3. SweepGradient

 

1. LinearGradient

 

LinearGradient는 시작점과 끝점을 따라 색상이 선형으로 변화하는 그라디언트입니다.

 

주요 속성

 

 colors: 그라디언트에 사용될 색상 배열.

 begin: 그라디언트의 시작점.

 end: 그라디언트의 끝점.

 stops: 각 색상의 위치를 지정하는 배열 (선택적).

body: Container(
  width: MediaQuery.of(context).size.width,
  height: MediaQuery.of(context).size.height,
  decoration: BoxDecoration(
    gradient: buildLinearGradient()
    
  ),
),
LinearGradient buildLinearGradient() {
    return LinearGradient(
          colors: [
            Colors.blue[100] as Color,
            Colors.blue[300] as Color,
            Colors.blue[500] as Color,
          ],
          // 왼쪽에서 오른쪽이 degault
          begin: Alignment.topCenter,
          end: Alignment.bottomCenter
        );
  }

 

 

2. RadialGradient

RadialGradient는 중심점에서 방사형으로 퍼지는 그라디언트입니다.

 

주요 속성

 

colors: 그라디언트에 사용될 색상 배열.

center: 그라디언트의 중심점.

radius: 그라디언트의 반지름.

stops: 각 색상의 위치를 지정하는 배열 (선택적).

body: Container(
  width: MediaQuery.of(context).size.width,
  height: MediaQuery.of(context).size.height,
  decoration: BoxDecoration(
    // gradient: buildLinearGradient()
    gradient: RadialGradient(
      center: Alignment.center,
      colors: [
        Colors.blue[100] as Color,
        Colors.blue[300] as Color,
        Colors.blue[500] as Color,
      ],
      radius: 1.0
    )
  ),
)

 

 

 

3. SweepGradient

 

SweepGradient는 중심점에서 시작하여 시계 방향으로 색상이 변하는 그라디언트입니다.

주요 속성

 

 colors: 그라디언트에 사용될 색상 배열.

 center: 그라디언트의 중심점.

 startAngle: 그라디언트가 시작되는 각도 (라디안 단위).

 endAngle: 그라디언트가 끝나는 각도 (라디안 단위).

 stops: 각 색상의 위치를 지정하는 배열 (선택적).

SweepGradient(
      colors: [Colors.red, Colors.blue, Colors.green],
      center: Alignment.center,
      startAngle: 0.0,
      endAngle: 3.14,
    )

 

 

 

주요 포인트

 

LinearGradient: 선형으로 색상이 변화합니다. 시작점과 끝점을 설정할 수 있습니다.

RadialGradient: 중심점에서 방사형으로 색상이 퍼집니다. 중심점과 반지름을 설정할 수 있습니다.

SweepGradient: 중심점에서 시작하여 시계 방향으로 색상이 변화합니다. 중심점, 시작 각도, 끝 각도를 설정할 수 있습니다.

colors: 그라디언트에 사용될 색상 배열입니다.

stops: 각 색상의 위치를 지정하는 배열로, 색상이 위치를 명확히 제어할 수 있습니다.

 

Gradient 문서

 

LinearGradient 클래스 문서

RadialGradient 클래스 문서

SweepGradient 클래스 문서

반응형
반응형

Flexible 위젯은 Flutter에서 부모 위젯의 공간을 자식 위젯이 유연하게 사용할 수 있도록 조정하는 레이아웃 위젯입니다. 주로 Row, Column, Flex와 같은 부모 위젯 내에서 사용됩니다. 자식 위젯이 부모 위젯의 공간을 얼마나 차지할지 결정할 수 있습니다.

 

주요 속성

 

1. flex: 자식 위젯이 차지할 공간의 비율을 지정합니다. 기본값은 1입니다.

2. fit: 자식 위젯이 남은 공간을 채우는 방식입니다. 기본값은 FlexFit.loose입니다.

 

FlexFit 옵션

 

FlexFit.loose: 자식 위젯이 최소한의 공간을 차지합니다.

FlexFit.tight: 자식 위젯이 가능한 모든 공간을 차지합니다.

 

body: Container(
  child: Row(
    children: [
      Flexible(
        flex: 1,
        child: Container(
          color: Colors.lightBlue,
        )
      ),
      Flexible(
          flex: 1,
          child: Container(
            color: Colors.yellow,
          )
      ),
    ],
  ),
)

 

주요 포인트

 

1. flex 속성: flex 속성은 자식 위젯이 부모 위젯의 공간을 얼마나 차지할지 비율로 지정합니다.

flex 값이 예를 들어 각각 1, 2, 3으로 설정되어 있어 전체 높이가 6 등분으로 나눠지고, 각 컨테이너가 차지하는 공간은 1/6, 2/6, 3/6입니다.

2. fit 속성: fit 속성은 자식 위젯이 남은 공간을 채우는 방식을 지정합니다.

FlexFit.loose: 자식 위젯이 최소한의 공간을 차지합니다.

FlexFit.tight: 자식 위젯이 가능한 모든 공간을 차지합니다.

 

Flexible과 Expanded 비교

 

FlexibleExpanded는 비슷한 역할을 하지만, ExpandedFlexible을 더 엄격하게 적용한 것입니다.

body: Container(
  child: Column(
    children: [
      Expanded(
        flex: 1,
        child: Container(
          color: Colors.lightBlue,
        )
      ),
      Expanded(
        flex: 1,
        child: Container(
          color: Colors.yellow,
        )
      ),
    ],
  ),
),

 

반응형
반응형

mage 위젯은 Flutter에서 이미지를 표시하는 가장 기본적인 위젯입니다. 다양한 이미지 소스에서 이미지를 가져올 수 있도록 지원합니다. 여기서는 NetworkImage를 사용하여 네트워크에서 이미지를 가져와 표시하는 예제에 대해 설명합니다.

 

주요 속성

 

image: 이미지 소스를 지정합니다. NetworkImage, AssetImage, FileImage, MemoryImage 등을 사용할 수 있습니다.

fit: 이미지의 박스 내에서의 배치 방법을 지정합니다. BoxFit 속성을 사용하여 조정합니다.

 

 

assets images 보여주기

body: Center(
          child: Image.asset('assets/images/my_image.png'),
        ),

 

네트워크 이미지 가져오기 예시

body: Container(
  width: MediaQuery.of(context).size.width,
  height: MediaQuery.of(context).size.height,
  child: Image(
    image: NetworkImage(
      'https://cdn.pixabay.com/photo/2024/06/23/06/27/lake-8847415_1280.jpg'
    ),
    // fit: BoxFit.fill,
  ),
)
body: Center(
          child: Image.network('https://flutter.dev/images/flutter-logo-sharing.png'),
        ),

 

 

속성 설명

 

1. Image 위젯:

image: NetworkImage를 사용하여 네트워크 URL에서 이미지를 가져옵니다.

fit: BoxFit.fill을 사용하여 이미지가 위젯의 박스를 채우도록 합니다.

2. NetworkImage:

url: 이미지의 URL을 지정합니다. 네트워크에서 이미지를 가져옵니다.

 

BoxFit 옵션

 

BoxFit.fill: 이미지의 원본 비율을 무시하고, 컨테이너를 완전히 채우도록 크기를 조정합니다.

BoxFit.contain: 이미지의 원본 비율을 유지하면서, 컨테이너 안에 완전히 들어가도록 크기를 조정합니다.

BoxFit.cover: 이미지의 원본 비율을 유지하면서, 컨테이너를 완전히 덮도록 크기를 조정합니다.

BoxFit.fitWidth: 이미지의 너비가 컨테이너의 너비에 맞춰지도록 크기를 조정합니다. 높이는 원본 비율을 유지합니다.

BoxFit.fitHeight: 이미지의 높이가 컨테이너의 높이에 맞춰지도록 크기를 조정합니다. 너비는 원본 비율을 유지합니다.

BoxFit.none: 이미지의 크기를 조정하지 않고, 원본 크기를 유지합니다.

BoxFit.scaleDown: 이미지의 크기를 원본 비율을 유지하면서 컨테이너에 맞도록 축소합니다.

 

예제 변경: BoxFit 옵션 비교

body: Column(
          children: <Widget>[
            Expanded(
              child: Image(
                image: NetworkImage(
                  'https://cdn.pixabay.com/photo/2024/06/23/06/27/lake-8847415_1280.jpg',
                ),
                fit: BoxFit.fill,
              ),
            ),
            Expanded(
              child: Image(
                image: NetworkImage(
                  'https://cdn.pixabay.com/photo/2024/06/23/06/27/lake-8847415_1280.jpg',
                ),
                fit: BoxFit.contain,
              ),
            ),
            Expanded(
              child: Image(
                image: NetworkImage(
                  'https://cdn.pixabay.com/photo/2024/06/23/06/27/lake-8847415_1280.jpg',
                ),
                fit: BoxFit.cover,
              ),
            ),
          ]

 

요약

 

Image 위젯: Flutter에서 이미지를 표시하는 기본 위젯입니다.

NetworkImage: 네트워크 URL에서 이미지를 가져오는 이미지 프로바이더입니다.

BoxFit: 이미지를 컨테이너 내에서 어떻게 맞출지 결정하는 속성입니다. 다양한 옵션을 통해 이미지의 배치 방법을 조정할 수 있습니다.

 

문서 참고

 

Image 클래스 문서

NetworkImage 클래스 문서

BoxFit 클래스 문서

반응형
반응형

AlertDialog 위젯은 Flutter에서 사용자에게 중요한 정보를 알리거나 선택을 요구할 때 사용하는 팝업 창입니다. 일반적으로 제목, 본문 내용, 액션 버튼(예: 확인, 취소)을 포함합니다.

 

주요 속성

 

title: 대화 상자의 제목을 설정합니다.

content: 대화 상자의 본문 내용을 설정합니다.

actions: 사용자가 선택할 수 있는 버튼 목록을 설정합니다.

shape: 대화 상자의 모양을 설정합니다.

backgroundColor: 대화 상자의 배경색을 설정합니다.

elevation: 대화 상자의 그림자 깊이를 설정합니다.

 

예시 

body: Container(
  child: Center(
    child: TextButton(
      onPressed: () {
        showDialog(
            context: context,
            builder: (BuildContext con) {
              return AlertDialog(
                title: const Text("Dialog Title"),
                content: Container(
                  child: const Text("Dialog Content"),
                ),
                actions: [
                  TextButton(
                      onPressed: () => Navigator.of(context).pop(), 
                      child: const Text("Close")
                  )
                ],
              );
            }
        );
      },
      child: const Text("팝업 버튼"),
    ),

  ),
),

 

다른예시

사용자 정의 AlertDialog

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('Custom AlertDialog Example'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  void _showCustomDialog(BuildContext context) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text("Custom Alert"),
          content: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Text("This is a custom alert dialog."),
              SizedBox(height: 20),
              FlutterLogo(size: 50),
            ],
          ),
          actions: <Widget>[
            TextButton(
              child: Text("Close"),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () => _showCustomDialog(context),
      child: Text('Show Custom AlertDialog'),
    );
  }
}

 

주요 포인트

 

title: 대화 상자의 제목을 설정합니다. 일반적으로 Text 위젯을 사용합니다.

content: 대화 상자의 본문 내용을 설정합니다. Text 위젯 또는 다른 복합 위젯을 사용할 수 있습니다.

actions: 대화 상자의 하단에 위치하는 버튼 목록을 설정합니다. TextButton 또는 ElevatedButton 등을 사용합니다.

showDialog: 대화 상자를 화면에 표시하는 함수입니다.

context: 대화 상자를 표시할 컨텍스트입니다.

builder: 대화 상자를 빌드하는 함수입니다. AlertDialog 위젯을 반환합니다.

Navigator.of(context).pop(): 대화 상자를 닫는 함수입니다.

 

AlertDialog 문서

 

AlertDialog 클래스 문서: AlertDialog 클래스 문서

showDialog 함수 문서: showDialog 함수 문서

반응형
반응형

Align 위젯은 Flutter에서 자식 위젯을 정렬할 때 사용하는 위젯입니다. 부모 위젯 내에서 자식 위젯의 위치를 정밀하게 제어할 수 있도록 합니다.

 

주요 속성

 

1. alignment: 자식 위젯을 정렬할 위치를 지정합니다.

2. widthFactor: 자식 위젯의 너비에 곱할 배수입니다.

3. heightFactor: 자식 위젯의 높이에 곱할 배수입니다.

 

alignment

 

alignment 속성은 Alignment 클래스의 인스턴스를 사용하여 자식 위젯의 정렬 위치를 지정합니다. Alignment 클래스에는 여러 가지 미리 정의된 상수가 있습니다.

 

Alignment.topLeft: 왼쪽 위 정렬

Alignment.topCenter: 중앙 위 정렬

Alignment.topRight: 오른쪽 위 정렬

Alignment.centerLeft: 왼쪽 중앙 정렬

Alignment.center: 중앙 정렬

Alignment.centerRight: 오른쪽 중앙 정렬

Alignment.bottomLeft: 왼쪽 아래 정렬

Alignment.bottomCenter: 중앙 아래 정렬

Alignment.bottomRight: 오른쪽 아래 정렬

 

 

다양한 정렬 위치 사용

body: Stack(
          children: <Widget>[
            Align(
              alignment: Alignment.topLeft,
              child: Container(
                width: 50,
                height: 50,
                color: Colors.red,
              ),
            ),
            Align(
              alignment: Alignment.topRight,
              child: Container(
                width: 50,
                height: 50,
                color: Colors.green,
              ),
            ),
            Align(
              alignment: Alignment.bottomLeft,
              child: Container(
                width: 50,
                height: 50,
                color: Colors.blue,
              ),
            ),
            Align(
              alignment: Alignment.bottomRight,
              child: Container(
                width: 50,
                height: 50,
                color: Colors.yellow,
              ),
            ),
          ],
        ),

widthFactor 및 heightFactor 사용

 

widthFactorheightFactor는 자식 위젯의 크기에 영향을 줍니다. 이 속성들을 사용하여 자식 위젯의 크기를 부모 위젯의 크기에 상대적으로 설정할 수 있습니다.

 

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('Align with widthFactor & heightFactor'),
        ),
        body: Center(
          child: Align(
            alignment: Alignment.center,
            widthFactor: 2.0,
            heightFactor: 2.0,
            child: Container(
              width: 100,
              height: 100,
              color: Colors.purple,
              child: Center(child: Text('Align')),
            ),
          ),
        ),
      ),
    );
  }
}

 

주요 포인트

 

Align 위젯은 부모 위젯 내에서 자식 위젯을 정렬하는 데 사용됩니다.

alignment 속성을 사용하여 자식 위젯의 정렬 위치를 지정할 수 있습니다.

widthFactorheightFactor 속성을 사용하여 자식 위젯의 크기를 상대적으로 설정할 수 있습니다.

 

Align 위젯 문서

 

Align 클래스 문서: Align 클래스 문서

Alignment 클래스 문서: Alignment 클래스 문서

반응형
반응형

 

 

body: Column(
  children: [
    Container(
      width: MediaQuery.of(context).size.width,
      height: 300,
      color: Colors.green,
    ),
    Container(
      width: MediaQuery.of(context).size.width,
      height: 300,
      color: Colors.green,
    ),
    Container(
      width: MediaQuery.of(context).size.width,
      height: 300,
      color: Colors.green,
    ),
    Container(
      width: MediaQuery.of(context).size.width,
      height: 300,
      color: Colors.green,
    )
  ],
)

flutter 에서는 다음과 같이 화면이 넘어가게 되면 에러를 냄

 

이런 경우 scrollview 를 추가해주면 됩니다.

body: SingleChildScrollView(
  child: Column(
    children: [
      Container(
        width: MediaQuery.of(context).size.width,
        height: 300,
        color: Colors.green,
      ),
      Container(
        width: MediaQuery.of(context).size.width,
        height: 300,
        color: Colors.green,
      ),
      Container(
        width: MediaQuery.of(context).size.width,
        height: 300,
        color: Colors.green,
      ),
      Container(
        width: MediaQuery.of(context).size.width,
        height: 300,
        color: Colors.yellow,
      )
    ],
  ),
)

 

이미 비슷한걸 많이 봤겠지만 

SingleChildScrollView(
  child: Column 
위 코드를 ListView 로만 바꾸어도 동작하게 됩니다. 



scrollowView 를 여러 부분으로 나누고 싶다면 SizedBox 라는 위젯으로 분리하게 되면 스크롤뷰 부분을 따로 나눌 수 있습니다.

body: SingleChildScrollView(
          child: Column(
            children: [
              buildSizedBox(context),
              buildSizedBox(context),
              buildSizedBox(context),
            ]
          ),
        )
       ...

SizedBox buildSizedBox(BuildContext context) {
    return SizedBox(
              height: MediaQuery.of(context).size.height / 3,
              child: SingleChildScrollView(
                  child: Column(
                      children: [
                        Container(
                          width: MediaQuery.of(context).size.width,
                          height: 300,
                          color: Colors.green,
                        ),
                        Container(
                          width: MediaQuery.of(context).size.width,
                          height: 300,
                          color: Colors.yellow,
                        )
                      ]
                  )
              ),
            );

코드 량이 길어져 하나로

반응형
반응형

GridView는 Flutter에서 스크롤 가능한 2차원 배열(그리드) 형태의 레이아웃을 제공하는 위젯입니다. 여러 항목을 정렬된 격자 형태로 배치할 때 유용합니다.

 

주요 종류

 

1. GridView

2. GridView.count

3. GridView.extent

4. GridView.builder

5. GridView.custom

 

gridView 시작하기

GridView는 일반적인 그리드를 표시합니다. 자식 위젯을 직접 리스트로 제공하는 방식입니다.

body: GridView(
  gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2, // 개수
    crossAxisSpacing: 15.0, // 주석 해보기 (가로 행간 길이)
    mainAxisSpacing: 12.0 // 주석 해보기(세로 행간 길이)
  ),
  children: [
    postContainer(),
    postContainer(),
    postContainer(),
    postContainer()
  ],
)

 

Widget postContainer() {
  return Container(
          height: 200,
          color: Colors.amber,
          child: Center(child: Text("Box")),
        );
}

 

파라미터로 변경

@override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text("안녕하세요"),
        ),
        body: GridView(
          gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2, // 개수
            crossAxisSpacing: 15.0, // 주석 해보기 (가로 행간 길이)
            mainAxisSpacing: 12.0 // 주석 해보기(세로 행간 길이)
          ),
          children: [
            postContainer(number: 1, colorData: Colors.green),
            postContainer(number: 2, colorData: Colors.amberAccent),
            postContainer(number: 3, colorData: Colors.green),
            postContainer(number: 4, colorData: Colors.cyan),
            postContainer(number: 5, colorData: Colors.green),
            postContainer(number: 6, colorData: Colors.amberAccent),
            postContainer(number: 7, colorData: Colors.green),
            postContainer(number: 8, colorData: Colors.cyan),
            postContainer(number: 9, colorData: Colors.green),
            postContainer(number: 10, colorData: Colors.amberAccent),
            postContainer(number: 11, colorData: Colors.green),
            postContainer(number: 12, colorData: Colors.cyan),
          ],
        )
    );
  }

  Widget postContainer({int number = 0, Color colorData = Colors.amber}) {
    return Container(
            height: 200,
            color: colorData,
            child: Center(child: Text("Box $number")),
          );
  }

GridView Builder 사용하기 

itemCount 와 itemBuilder 로 아래와 같이 구성 가능합니다.

final postList = [
    {
      "number": 1,
      "colorData": Colors.green
    },
    {
      "number": 2,
      "colorData": Colors.blue
    },
    {
      "number": 3,
      "colorData": Colors.amberAccent
    },
    {
      "number": 4,
      "colorData": Colors.cyan
    },
    {
      "number": 5,
      "colorData": Colors.cyan
    },
    {
      "number": 6,
      "colorData": Colors.amberAccent
    },
    {
      "number": 7,
      "colorData": Colors.green
    }
  ];

@override
Widget build(BuildContext context) {
  return Scaffold(
      appBar: AppBar(
        title: const Text("안녕하세요"),
      ),
      body:  GridView.builder(
            gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 2,
              crossAxisSpacing: 15.0,
              mainAxisSpacing: 12.0
            ),
            itemCount: postList.length,
            itemBuilder: (BuildContext con, int index) {
              return postContainer(
                number: postList[index]["number"] as int,
                colorData: postList[index]["colorData"] as Color
              );
            }),
      );
}

Widget postContainer({int number = 0, Color colorData = Colors.amber}) {
  return Container(
          height: 200,
          color: colorData,
          child: Center(child: Text("Box $number")),
        );
}

 

 

다른 예시

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(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2, // 열의 수
          ),
          children: <Widget>[
            Container(color: Colors.red, child: Center(child: Text('1'))),
            Container(color: Colors.green, child: Center(child: Text('2'))),
            Container(color: Colors.blue, child: Center(child: Text('3'))),
            Container(color: Colors.yellow, child: Center(child: Text('4'))),
          ],
        ),
      ),
    );
  }
}

GridView.count

 

GridView.count는 그리드 레이아웃을 구성할 때 각 행에 고정된 개수의 항목을 배치할 수 있는 간편한 방법을 제공합니다.

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.count Example'),
        ),
        body: GridView.count(
          crossAxisCount: 2, // 열의 수
          children: <Widget>[
            Container(color: Colors.red, child: Center(child: Text('1'))),
            Container(color: Colors.green, child: Center(child: Text('2'))),
            Container(color: Colors.blue, child: Center(child: Text('3'))),
            Container(color: Colors.yellow, child: Center(child: Text('4'))),
          ],
        ),
      ),
    );
  }
}

GridView.extent

 

GridView.extent는 항목의 최대 크기를 지정하여 그리드 레이아웃을 구성합니다. 각 항목의 크기를 자동으로 조정하여 그리드를 구성합니다.

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.extent Example'),
        ),
        body: GridView.extent(
          maxCrossAxisExtent: 150, // 항목의 최대 크기
          children: <Widget>[
            Container(color: Colors.red, child: Center(child: Text('1'))),
            Container(color: Colors.green, child: Center(child: Text('2'))),
            Container(color: Colors.blue, child: Center(child: Text('3'))),
            Container(color: Colors.yellow, child: Center(child: Text('4'))),
          ],
        ),
      ),
    );
  }
}

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: 2, // 열의 수
          ),
          itemCount: 20,
          itemBuilder: (context, index) {
            return Container(
              margin: EdgeInsets.all(4.0),
              color: Colors.blue,
              child: Center(child: Text('Item $index')),
            );
          },
        ),
      ),
    );
  }
}

GridView.custom

 

GridView.custom은 사용자 정의 레이아웃을 만들 때 사용됩니다. SliverChildDelegate를 통해 자식 위젯의 레이아웃을 정의할 수 있습니다.

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.custom Example'),
        ),
        body: GridView.custom(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2, // 열의 수
          ),
          childrenDelegate: SliverChildBuilderDelegate(
            (context, index) {
              return Container(
                margin: EdgeInsets.all(4.0),
                color: Colors.green,
                child: Center(child: Text('Item $index')),
              );
            },
            childCount: 20,
          ),
        ),
      ),
    );
  }
}

 

주요 속성

 

gridDelegate: 그리드 레이아웃을 정의합니다.

SliverGridDelegateWithFixedCrossAxisCount: 고정된 열의 수를 정의합니다.

SliverGridDelegateWithMaxCrossAxisExtent: 항목의 최대 크기를 정의합니다.

children: 그리드 항목으로 사용할 위젯 목록입니다 (GridView, GridView.count, GridView.extent).

itemBuilder: 각 항목을 빌드하는 함수입니다 (GridView.builder, GridView.custom).

itemCount: 항목의 개수를 정의합니다 (GridView.builder, GridView.custom).

 

GridView 문서

 

GridView 클래스 문서

GridView.count 클래스 문서

GridView.extent 클래스 문서

GridView.builder 클래스 문서

GridView.custom 클래스 문서

반응형

+ Recent posts