반응형

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 클래스 문서

반응형
반응형

ListView는 Flutter에서 스크롤 가능한 리스트를 만들기 위해 사용하는 위젯입니다. 많은 데이터 항목을 스크롤 가능한 리스트로 표시할 때 매우 유용합니다. ListView는 여러 종류가 있으며, 각각의 용도에 맞게 사용될 수 있습니다.

 

 

일반 리스트뷰 샘플

body: ListView(
  children: [
    Container(
      padding: const EdgeInsets.all(10),
      child: const Text(
          "title 1",
          style: TextStyle(
            fontSize: 30,
            fontWeight: FontWeight.bold
          ),
      ),
    ),
    Container(
      width: MediaQuery.of(context).size.width,
      height: 100,
      color: Colors.red,
    ),
    Container(
      padding: const EdgeInsets.all(10),
      child: const Text(
        "title 1",
        style: TextStyle(
            fontSize: 30,
            fontWeight: FontWeight.bold
        ),
      ),
    ),
    Container(
      width: MediaQuery.of(context).size.width,
      height: 100,
      color: Colors.red,
    ),
    Container(
      padding: const EdgeInsets.all(10),
      child: const Text(
        "title 1",
        style: TextStyle(
            fontSize: 30,
            fontWeight: FontWeight.bold
        ),
      ),
    ),
    Container(
      width: MediaQuery.of(context).size.width,
      height: 100,
      color: Colors.red,
    )
  ],
)

위와 같이 listview 의 children 에 여러개의 컴포넌트를 넣는다면 코드가 복잡해지기 때문에 하나의 컴포넌트로 만들필요가 있습니다. 

 

 

 

리스트 view 의 아이템을 컴포넌트 화 해보기

body: ListView(
  children: [
    postContainer(title: "title 1"),
    postContainer(title: "title 2", colorData: Colors.blue),
    postContainer(title: "title 3", colorData: Colors.green)
  ],
)
Widget postContainer({String title = '', Color colorData = Colors.red}) {
  return Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
      Container(
        padding: const EdgeInsets.all(10),
        child: Text(
          title,
          style: const TextStyle(
              fontSize: 30,
              fontWeight: FontWeight.bold
          ),
        ),
      ),
      Container(
        width: MediaQuery.of(context).size.width,
        height: 100,
        color: colorData,
      )
    ],
  );
}

 

title 과 color 를 변수로 사용할 수 있습니다. 

 

만약 가로 스크롤을 원한다면 scrollDirection 을 변경해주면 됩니다.

body: ListView(
  scrollDirection: Axis.horizontal,



ListView.Builder 

final postList = [
  {
    "title" : "Sample title 1" ,
    "color" : Colors.blue
  },
  {
    "title" : "Sample title 2" ,
    "color" : Colors.greenAccent
  },
  {
    "title" : "Sample title 3" ,
    "color" : Colors.lime
  },
  {
    "title" : "Sample title 4" ,
    "color" : Colors.blue
  },
  {
    "title" : "Sample title 5" ,
    "color" : Colors.green
  },
  {
    "title" : "Sample title 6" ,
    "color" : Colors.yellow
  },
  {
    "title" : "Sample title 7" ,
    "color" : Colors.red
  },
];

위와 같은 데이터가 선언되어 있을 때 ListView.builder 를 사용하여 쉽게 구현할 수 있습니다. 

itemCount 및 itemBuilder 속성을 통하여 list data 를 노출할 수 있습니다.

body: ListView.builder(
    itemCount: postList.length,
    itemBuilder: (BuildContext con, int index)  {
      return postContainer(
          title: postList[index]["title"] as String,
          colorData: postList[index]["color"] as Color
      );
    }
)

 


다른 예시

기본 ListView 

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('Basic ListView'),
        ),
        body: ListView(
          padding: EdgeInsets.all(8.0),
          children: <Widget>[
            ListTile(
              title: Text('Item 1'),
            ),
            ListTile(
              title: Text('Item 2'),
            ),
            ListTile(
              title: Text('Item 3'),
            ),
          ],
        ),
      ),
    );
  }
}

 

ListView.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('ListView.builder Example'),
        ),
        body: ListView.builder(
          itemCount: 20,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text('Item $index'),
            );
          },
        ),
      ),
    );
  }
}

 

주요 속성

children: 리스트에 표시할 위젯 목록을 지정합니다 (ListView).

itemCount: 리스트 항목의 개수를 지정합니다 (ListView.builder, ListView.separated).

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

separatorBuilder: 항목 사이에 구분자를 빌드하는 함수입니다 (ListView.separated).

scrollDirection: 리스트의 스크롤 방향을 지정합니다. 기본값은 Axis.vertical입니다.

padding: 리스트의 패딩을 지정합니다.

reverse: 스크롤 방향을 반대로 설정할지 여부를 지정합니다. 기본값은 false입니다.



ListView 문서

 

ListView 클래스 문서

ListView.builder 클래스 문서

ListView.separated 클래스 문서

ListView.custom 클래스 문서

반응형
반응형

 

Flutter에서 클릭 이벤트를 처리하는 방법에는 여러 가지가 있습니다. 가장 일반적인 방법은 ElevatedButton과 같은 버튼 위젯을 사용하는 것이며, 보다 정밀한 제어가 필요할 때는 GestureDetector 위젯을 사용할 수 있습니다. 각각의 방법에 대해 설명하겠습니다.

 

1. ElevatedButton 클릭 이벤트

 

ElevatedButton은 Flutter에서 기본적으로 제공되는 버튼 위젯 중 하나입니다. 사용자가 버튼을 클릭했을 때 특정 동작을 수행하기 위해 onPressed 콜백을 정의합니다.

 

body: Center(
          child: ElevatedButton(
            onPressed: () {
              print('Button clicked!');
            },
            child: Text('Click Me'),
          ),
        ),

 

body: Center(
  child: TextButton(
    onPressed: () => print("버튼이 클릭되었습니다."),
    child: const Text("버튼"),
  ),
),

 

button 을 클릭해야지만 프린트 부분이 출력됩니다. 

 

 

2. GestureDetector 클릭 이벤트

 

GestureDetector 위젯은 더 정밀하게 제어할 수 있는 다양한 제스처 이벤트를 처리할 수 있습니다. 클릭(탭), 두 번 클릭, 길게 누르기 등 다양한 제스처를 처리할 수 있습니다.

body: Center(
  child: GestureDetector(
    onTap: () => print("gesture detect on tap"),
    child: Container(
      width: 200,
      height: 200,
      color: Colors.amber,
    ),
  ),
),

body: Center(
          child: GestureDetector(
            onTap: () {
              print('Container clicked!');
            },
            onDoubleTap: () {
              print('Container double-clicked!');
            },
            onLongPress: () {
              print('Container long-pressed!');
            },
            child: Container(
              width: 200,
              height: 200,
              color: Colors.blue,
              child: Center(
                child: Text(
                  'Tap me',
                  style: TextStyle(color: Colors.white, fontSize: 20),
                ),
              ),
            ),
          ),
        )

 

 

container 부분을 클릭해야지만 Print 가 출력이 됩니다. 

 

레퍼런스

 

ElevatedButton 문서

GestureDetector 문서

 

 

반응형
반응형

 

 

Stack 위젯은 Flutter에서 여러 자식 위젯을 서로 겹쳐서 배치할 수 있도록 하는 레이아웃 위젯입니다. Stack 위젯은 Positioned 위젯과 함께 사용하여 자식 위젯의 위치를 지정할 수 있으며, 이를 통해 복잡한 레이아웃을 쉽게 구성할 수 있습니다.

 

주요 속성

 

alignment: Stack 내에서 자식 위젯을 정렬하는 방법을 지정합니다. 기본값은 AlignmentDirectional.topStart입니다.

fit: 자식 위젯이 Stack의 크기에 어떻게 맞춰질지 지정합니다. StackFit.loose(기본값), StackFit.expand, StackFit.passthrough 등이 있습니다.

overflow: 자식 위젯이 Stack의 경계를 넘을 때 어떻게 처리할지 지정합니다. Overflow.clip(기본값), Overflow.visible 등이 있습니다.

 

주요 사용 사례

 

1. 단순 겹침

2. 정확한 위치 지정

 

body: Container(
  child: Stack(
    children: [
      Container(
        width: 150,
        height: 200,
        color: Colors.red,
      ),
      Container(
        width: 150,
        height: 200,
        margin: const EdgeInsets.only(top: 50, left: 50),
        color: Colors.blue,
      )
    ],
  ),
)

두번때 container 에 margin 을 위 50 좌 50 을 주는 코드입니다. 

stack 을 활용한 도형 겹치기 실습입니다. 

body: Container(
  width: MediaQuery.of(context).size.width,
  height: MediaQuery.of(context).size.height,
  color: Colors.yellow,
  child: Stack(
    children: [
      Container(
        width: 150,
        height: 200,
        color: Colors.red,
      ),
      Container(
        width: 150,
        height: 200,
        margin: const EdgeInsets.only(top: 50, left: 50),
        color: Colors.blue,
      ),
      Container(
        width: 150,
        height: 200,
        margin: const EdgeInsets.only(top: 100, left: 100),
        color: Colors.green,
      ),
      Container(
        width: 150,
        height: 200,
        margin: const EdgeInsets.only(top: 150, left: 150),
        color: Colors.orange,
      ),
    ],
  ),
)

 

positioned 위젯으로도 같은 내용을 표현 가능합니다.

Container(
  width: 150,
  height: 200,
  color: Colors.red,
),
Container(
  width: 150,
  height: 200,
  margin: const EdgeInsets.only(top: 50, left: 50),
  color: Colors.blue,
),
Positioned(
  left: 100,
  top: 100,
  // right: 10,
  // bottom: 10,
  child: Container(
    width: 150,
    height: 200,
    color: Colors.green,
  ),
),
Container(
  width: 150,
  height: 200,
  margin: const EdgeInsets.only(top: 150, left: 150),
  color: Colors.orange,
),

 

Stack 위젯 문서: https://api.flutter.dev/flutter/widgets/Stack-class.html

Positioned 위젯 문서: https://api.flutter.dev/flutter/widgets/Positioned-class.html

반응형
반응형

 

body 안에 컨테이너를 구성하겠습니다. 

 

세로로 가로세로 200px 박스를 구성해보겠습니다. 

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: const Text("안녕하세요"),
    ),
    body: Container(
      alignment: Alignment.center,
      child: Column(
        children: [
          Container(
            width: 200,
            height: 200,
            color: Colors.blue,
          ),
          Container(
            width: 200,
            height: 200,
            color: Colors.red,
          )
        ],
      ),
    ),
  );
}

 

결과물입니다. 

 

Column 을 Row 로 변경해주면 정렬이 가로로 변경됩니다.

body: Container(
  alignment: Alignment.center,
  child: Row(
    children: [
      Container(
        width: 200,
        height: 200,
        color: Colors.blue,
      ),
      Container(
        width: 200,
        height: 200,
        color: Colors.red,
      )
    ],
  ),
)

그리고 여기서 Row 에 우클릭 하게 되면 Show Context Actions 를 누르게 되면 더 할 수 있는 액션들이 나옵니다. 

한열에 여러개의 row(행) 를 추가하려면 어떻게 할까요? 

여기서 wrap with column 을 하게되면 아래와 같이 하나의 column 에 여러개의 row를 추가할 수 있게 children 이 생깁니다.

body: Container(
  alignment: Alignment.center,
  child: Column(
    children: [
      Row(
        children: [
          Container(
            width: 150,
            height: 200,
            color: Colors.blue,
          ),
          Container(
            width: 150,
            height: 200,
            color: Colors.red,
          )
        ],
      ),
    ],
  ),
)

하나의 줄이고 row 를 추가하게 되면

아래 코드처럼 row 를 추가합니다. 

body: Container(
  alignment: Alignment.center,
  child: Column(
    children: [
      Row(
        children: [
          Container(
            width: 150,
            height: 200,
            color: Colors.blue,
          ),
          Container(
            width: 150,
            height: 200,
            color: Colors.red,
          )
        ],
      ),
      Row(
        children: [
          Container(
            width: 150,
            height: 200,
            color: Colors.blue,
          ),
          Container(
            width: 150,
            height: 200,
            color: Colors.red,
          )
        ],
      ),
    ],
  ),

여기서 추가로 정렬에 대해서 말씀드리겠습니다.

child: Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: [

column 에는 mainAxisAlignment 라는 속성이 있어서 해당 속성값을 center 로 해주면 세로(열) 정렬이 중앙이 됩니다.

column 클래스에 대해서 mainAxisAlignment 이기 때문에 세로(열) 정렬이고
row 클래스 내에서 mainAxisAlignment 인 경우 가로 정렬입니다. 

추가로 column 클래스의 crossAxisAlignment 는 가로(행) 정렬입니다. 

crossAxisAlignment: CrossAxisAlignment.center,

 

박스를 가운데로 정렬하는 코드는 아래와 같이 해주면 됩니다.

child: Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: [
           Row(
             mainAxisAlignment: MainAxisAlignment.center,
             ...
           ),
           Row(
             mainAxisAlignment: MainAxisAlignment.center,
             ...
           ),
           ]

여기서 만약 정렬이 아니라 어떤 기종이든 화면 가득 스크린을 채우고 싶다면 MediaQuery 를 이용하면 됩니다.

상자가 2개 이기 때문에 MediaQuery.size.width 에서 2를 나누면 두개의 container 가 화면을 가득채우게 됩니다. 

Row(
  mainAxisAlignment: MainAxisAlignment.center,
  children: [
    Container(
      width: MediaQuery.of(context).size.width / 2,
      height: 200,
      color: Colors.blue,
    ),
    Container(
      width: MediaQuery.of(context).size.width / 2,
      height: 200,
      color: Colors.red,
    )
  ],

 

요약

 

ColumnRow를 사용하여 위젯을 세로 또는 가로로 정렬.

mainAxisAlignmentcrossAxisAlignment로 정렬 제어.

MediaQuery를 사용하여 화면 크기에 맞게 위젯 크기 조절 가능.

반응형
반응형

Flutter에서는 다양한 종류의 위젯을 제공하여 사용자 인터페이스를 구축할 수 있습니다. 주요 위젯들은 다음과 같은 범주로 나눌 수 있습니다.

1. 기본 위젯

Text

  • 설명: 텍스트를 화면에 표시하는 위젯.
  • 사용 예시:
     
Text('Hello, Flutter!')

Container

  • 설명: 레이아웃, 스타일, 배경색, 패딩 등을 조정할 수 있는 다목적 위젯.
  • 사용 예시:
     
Container(
  padding: EdgeInsets.all(16.0),
  color: Colors.blue,
  child: Text('Hello, Container!'),
)

레퍼런스: https://api.flutter.dev/flutter/widgets/Container-class.html

Column

Column( children: <Widget>[ Text('First Item'), Text('Second Item'), ], )

Row

Row( children: <Widget>[ Text('First Item'), Text('Second Item'), ], )

Image

Image.network('https://flutter.dev/images/flutter-logo-sharing.png')

Stack

 

2. 입력 위젯

TextField

TextField( decoration: InputDecoration( labelText: 'Enter your name', ), )

RaisedButton (Deprecated), ElevatedButton

ElevatedButton( onPressed: () {}, child: Text('Click Me'), )

Checkbox, Radio, Switch

Checkbox( value: true, onChanged: (bool? value) {}, )

3. 레이아웃 위젯

Padding

Padding( padding: EdgeInsets.all(16.0), child: Text('Padded Text'), )

Center

Center( child: Text('Centered Text'), )

Expanded

Row( children: <Widget>[ Expanded( child: Text('Expanded Text'), ), ], )

ListView

ListView( children: <Widget>[ ListTile(title: Text('Item 1')), ListTile(title: Text('Item 2')), ], )

4. 네비게이션 위젯

Navigator

Navigator.push( context, MaterialPageRoute(builder: (context) => SecondPage()), )

Drawer

Drawer( child: ListView( padding: EdgeInsets.zero, children: <Widget>[ DrawerHeader( child: Text('Drawer Header'), decoration: BoxDecoration( color: Colors.blue, ), ), ListTile( title: Text('Item 1'), onTap: () {}, ), ], ), )

5. 애니메이션 위젯

AnimatedContainer

AnimatedContainer( duration: Duration(seconds: 1), color: _color, child: FlutterLogo(size: 75), )

FadeTransition

FadeTransition( opacity: _animation, child: FlutterLogo(size: 100.0), )

 

머티리얼 디자인 위젯

a. Scaffold

b. AppBar

c. FloatingActionButton

 

 

레퍼런스

 

반응형

'프론트엔드 > Flutter' 카테고리의 다른 글

flutter stack 위젯  (2) 2024.07.16
flutter column row 테이블 구성  (0) 2024.07.16
flutter 개발 시 유용한 코드 스니펫  (0) 2024.07.15
dart 기본 문법  (0) 2024.07.14
flutter 앱 빌더 및 레퍼런스 모음  (0) 2024.07.14

+ Recent posts