Flutter Column 정렬

Ruinak·2021년 9월 25일
0

Flutter

목록 보기
4/12
post-thumbnail

Column

width 사용

body: Column(
  children: [
    // Expanded는 남는 공간 끝까지 확장하라는 명령어
    Expanded(
      // flex를 사용하면 비율을 정할 수 있습니다.
      flex: 5,
      child: Container(
        color: Colors.red,
        width: 100,
        // height: 50,
      ),
    ),
    ...
  ],
),
  • width를 사용하면 너비를 지정할 수 있습니다.
  • 나머지 영역이 부모의 최대 크기에 맞춰져 있으므로 red 영역은 가운데 정렬을 하게 됩니다.
  • 모두 width를 100으로 주면 정렬기준이 제일 왼쪽으로 줍니다.
  • 하나라도 최대 크기까지 늘리면 다시 가운데 정렬이 됩니다.
  • width가 모두 동일한 상태에서 가운데 정렬을 하고 싶을땐 Column에서 설정해야 합니다.

mainAxisAlignment를 이용한 세로 정렬

body: Column(
  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  children: [
    // Expanded는 남는 공간 끝까지 확장하라는 명령어
    Container(
      color: Colors.red,
      width: 100,
      height: 100,
    ),
    Container(
      color: Colors.orange,
      width: 100,
      height: 100,
    ),
    Container(
      color: Colors.green,
      width: 100,
      height: 100,
    ),
  ],
),
  • Container의 Expanded에서 Alt + Enter를 입력해 Expanded(widget)을 제거합니다.
  • Expanded를 제거했으므로 각 Container에 height 값을 지정해줍니다.
  • Column에 mainAxisAlignment를 추가해줍니다.
  • Column에서 mainAxisAlignment를 이용해서 세로 정렬 기준을 지정할 수 있습니다.
  • spaceEvenly, spaceAround, spaceBetween, center 등을 이용해서 지정 가능합니다.

crossAxisAlignment를 이용한 가로 정렬

body: Column(
  mainAxisAlignment: MainAxisAlignment.spaceAround,
  crossAxisAlignment: CrossAxisAlignment.center,
  children: [
    // Expanded는 남는 공간 끝까지 확장하라는 명령어
    Container(
      color: Colors.red,
      width: 100,
      height: 100,
    ),
    Container(
      color: Colors.orange,
      width: 100,
      height: 100,
    ),
    Container(
      color: Colors.green,
      height: 100,
    ),
  ],
),
  • 우선 Container 하나의 width를 지워줍니다.
  • Column에 crossAxisAlignment를 추가해줍니다.
  • Column에서 crossAxisAlignment를 이용해서 가로 정렬 기준을 지정할 수 있습니다.

stretch(제약조건)

body: Column(
  // 부모의 제약조건을 자식이 따라감
  mainAxisAlignment: MainAxisAlignment.spaceAround,
  crossAxisAlignment: CrossAxisAlignment.stretch,
  children: [
    ...
  ],
),
  • stretch를 사용하면 Container의 width를 무시하고 전체 길이를 차지하게 됩니다.
  • stretch는 컬럼에 있는 모든 요소를 끝가지 가게하라는 의미를 가집니다.
  • 플러터는 부모의 크기에 맞게 자식이 따라갑니다. 즉 부모의 제약조건을 자식이 따라갑니다.

전체 코드

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

// main 스레드는 runApp 을 실행시키고 종료됩니다.
void main() {
  // 비동기로 실행됨(이벤트 루프에 등록된다)
  runApp(FirstApp());
  // sleep(Duration(seconds: 2));
  // print("main 종료");
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SafeArea(
        child: Scaffold(
          // 기본 구조 1. AppBar
          appBar: AppBar(
            backgroundColor: Colors.blueAccent,
            title: Text("First App"),
            leading: Icon(Icons.menu),
          ),
          // 기본 구조 2. body
          // Container의 부모는 Column인데 Column은 크기가 없음. 크기 지정이 필요
          body: Column(
            // 부모의 제약조건을 자식이 따라감
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [
              // Expanded는 남는 공간 끝까지 확장하라는 명령어
              Container(
                color: Colors.red,
                width: 100,
                // height: 100,
              ),
              Container(
                color: Colors.orange,
                width: 100,
                height: 100,
              ),
              Container(
                color: Colors.green,
                height: 100,
              ),
            ],
          ),
          // 기본 구조 3. floatingActionButton
          floatingActionButton: FloatingActionButton(
            child: Text("Button"),
            onPressed: () {
              print("버튼 클릭됨");
            },
          ),
          // 기본 구조 4. bottomNavigationBar
          bottomNavigationBar: BottomNavigationBar(
            items: [
              BottomNavigationBarItem(
                  label: "hello", icon: Icon(Icons.access_alarm_rounded)),
              BottomNavigationBarItem(
                  label: "hello", icon: Icon(Icons.access_alarm_rounded))
            ],
            backgroundColor: Colors.yellow,
          ),
        ),
      ),
    );
  }
}
profile
Nil Desperandum <절대 절망하지 마라>

0개의 댓글