Flutter

[FLUTTER] Column & Row

Eunice99 2023. 3. 23. 17:30

[Column]

Column 위젯은 세로 방향에 대한 레이아웃을 잡을 때 사용
Column(
  children: [ // 자식 위젯들
    Text("위젯1"),
    Text("위젯2"),
  ],
),

: 리펙터하고싶은 위젯 선택해서 window / macOS : Ctrl + Shift + R 단축키 이용하기

 

[mainAxisSize]

: 세로 방향에 대한 크기

/// Copyright 2022. ⓒ DevStory.co.kr All rights reserved.

// ignore_for_file: prefer_const_constructors
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Container(
          color: Colors.green,
          child: Column(
            mainAxisSize: MainAxisSize.max, // 세로 길이 : max(default) -기본값이므로 해당 코드 지워도 동일한 결과
            children: [
              Container(
                height: 100,
                width: 100,
                color: Colors.amber,
              ),
              Container(
                height: 100,
                width: 100,
                color: Colors.blue,
              ),
              Container(
                height: 100,
                width: 100,
                color: Colors.pink,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

여기서 중요하게 볼것은, mainAxisSize: MainAxisSize.max 

max로 지정하면 : 부모를 가득 채우는것 (이게 default값)
min으로 지정하면 : 자식의 크기만큼만 차지

[mainAxisAlignment]

세로 방향에 대한 정렬
/// Copyright 2022. ⓒ DevStory.co.kr All rights reserved.

// ignore_for_file: prefer_const_constructors
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Container(
          color: Colors.green,
          child: Column(
            // Column이 가진 Child들을 어떻게 정리할건지 나타냄
            mainAxisAlignment: MainAxisAlignment.start, // 세로 방향 정렬 : start(default)
            children: [
              Container(
                height: 100,
                width: 100,
                color: Colors.amber,
              ),
              Container(
                height: 100,
                width: 100,
                color: Colors.blue,
              ),
              Container(
                height: 100,
                width: 100,
                color: Colors.pink,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

여기서 중요하게 볼것은, mainAxisAlignment: MainAxisAlignment.start

start : 시작에 배치 (default값)
center : 중앙에 배치
end : 끝에 배치
spaceBetween : 양끝에 배치하고 등분
spaceAround : 균등하게 나누고 공간의 절반을 앞뒤에
spaceEvenly : 균등하게 등분

 

[crossAxisAlignment]

가로 방향에 대한 정렬
/// Copyright 2022. ⓒ DevStory.co.kr All rights reserved.

// ignore_for_file: prefer_const_constructors
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Container(
          width: double.infinity, // Column의 CrossAxis는 부모 및 자식의 크기에 영향을 받습니다.
          color: Colors.green,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center, // 가로 방향 정렬 : center(default)
            children: [
              Container(
                height: 100,
                width: 100,
                color: Colors.amber,
              ),
              Container(
                height: 100,
                width: 100,
                color: Colors.blue,
              ),
              Container(
                height: 100,
                width: 100,
                color: Colors.pink,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

여기서 중요하게 볼것은, crossAxisAlignment: CrossAxisAlignment.center,

start : 시작에 배치 (default값)
center : 중앙에 배치
end : 끝에 배치
stretch : 늘려서 가득 채움


[Row]

Row 위젯은 가로 방향에 대한 레이아웃을 잡을 때 사용
  • mainAxisAlignment : 가로 방향에 대한 정렬
  • crossAxisAlignment : 세로 방향에 대한 정렬
body: Column(
        children: [
          // 이미지
          Image.network(
            "https://cdn2.thecatapi.com/images/kat_7kqBi.png",
            height: 400,
            width: double.infinity,
            //  이미지의 비율을 유지하면서 고정된 폭과 높이에 맞추어 이미지를 적절히 잘라서 보여줌.
            fit: BoxFit.cover,
          ),
          Row(
            children: [
              IconButton(
                icon: Icon(CupertinoIcons.heart, color: Colors.black),
                onPressed: () {},
              ),
              IconButton(
                icon: Icon(CupertinoIcons.chat_bubble, color: Colors.black),
                onPressed: () {},
              ),
              Spacer(), // 자신이 커질수있는만큼 최대한 커지면서 공백을 만들어주는 위젯
              IconButton(
                icon: Icon(CupertinoIcons.bookmark, color: Colors.black),
                onPressed: () {},
              )
            ],
          )
        ],
      ),

아래 그림처럼 위젯 세개를 가로방향으로 잡아줄때 사용! 

Spacer() 위젯 : 빈 공간을 차지하는 위젯 (자신이 커질수있는만큼 최대한 커짐!)