본문 바로가기
flutter/Widget of the Week

Flutter[플러터] / Container 를 사용하여 박스 만들기 (컨테이너, 상자) Container (Flutter Widget of the Week)

by ch5c 2025. 6. 11.
반응형

Container class

일반적인 페인팅, 위치 지정, 크기 조정 위젯을 결합한 편리한 위젯입니다.

컨테이너는 먼저 자식 요소를 패딩 ( 장식에 있는 테두리에 의해 팽창됨 )으로 둘러싼 다음, 패딩 된 ​​범위에 추가 제약 조건을width 적용합니다( 그리고 둘 중 하나가 null이 아닌 경우 제약 조건으로 포함). 그런 다음 컨테이너는 여백 height 에서 설명된 추가 빈 공간으로 둘러싸입니다.

페인팅하는 동안 컨테이너는 먼저 주어진 변형을 적용한 다음 패딩 된 범위를 채우도록 장식을 칠하고, 그다음 자식을 칠하고, 마지막으로 패딩된 범위를 채우는 전경 장식을 칠합니다.

자식이 없는 컨테이너는 들어오는 제약 조건이 제한되지 않는 한 최대한 크게 만들려고 노력하지만, 제한되지 않은 경우에는 최대한 작게 만들려고 노력합니다. 자식이 있는 컨테이너는 자식 컨테이너의 크기에 맞춰 크기가 조정됩니다. 생성자에 대한 width, height, 및 제약 조건 인수는 이 인수를 재정의합니다.

기본적으로 컨테이너는 모든 적중 테스트에 대해 false를 반환합니다. color 속성이 지정되면 적중 테스트는 ColoredBox 에 의해 처리되며 , 항상 true를 반환합니다. decoration 또는 foregroundDecoration 속성이 지정되면 적중 테스트는 Decoration.hitTest 에 의해 처리됩니다.

https://youtu.be/c1xLMaTUWCY

공식 문서 코드

 


 

Flutter 를 처음 접했을 때 일단 맨 처음 접하는 것을 뽑아보라고 한다면 단연콘데 Container 가 거론될 것이다.

Container 는 배경색을 주고 싶거나 모양을 바꾸고 싶거나 크기 제한을 두고 싶을 때 사용된다.

Container 위젯은 하위 요소 위젯의 구성, 장식 그리고 위치를 정할 수 있도록 도와준다.

컨테이너는 기본적으로 '박스'라고 생각하면 편하다. 이제 화면 내에서 그 박스를 어떻게 꾸밀 건지 정할 수 있도록 하는 것인데 한번 한번 정말 쉽게 알아보자.

하위 속성
속성명 타입 기본값 설명
alignment AlignmentGeometry? null 자식 위젯을 컨테이너 내에서 정렬할 위치
padding EdgeInsetsGeometry? null 데코레이션 내부에서 자식 위젯과의 여백
color Color? null 배경색을 지정할 때 사용, decoration과 동시에 사용할 수 없음
decoration Decoration? null 배경을 꾸미는 데 사용하는 장식 요소
foregroundDecoration Decoration? null 자식 위젯 위에 그려지는 장식 요소
width double? null 컨테이너의 너비, constraints와 함께 사용됨
height double? null 컨테이너의 높이, constraints와 함께 사용됨
constraints BoxConstraints? null 자식 위젯에 적용할 제약 조건
margin EdgeInsetsGeometry? null 컨테이너 외부의 여백
transform Matrix4? null 컨테이너에 적용할 변환 행렬
transformAlignment AlignmentGeometry? null transform 적용 시 기준이 되는 정렬 위치
clipBehavior Clip Clip.none decoration이 지정된 경우 적용할 클립 방식
child Widget? null 컨테이너 안에 배치할 자식 위젯

 

컨테이너는 기본적으로 크기를 가질 수 있는 위젯이다.

하지만 크기만을 가지는 위젯이냐 하면 '확실하게 아니다.'라고 말할 수 있다. 정확히는 크기와 색을 가질 수 있고 변형 가능한 위젯이 되겠는데 코드를 보자면

Container(
  width: 100,
  height: 100,
  color: Colors.blue,
),

이렇게 width 와 height 속성으로 크기를 지정해 줄 수 있다. 이로써 화면에 100 x 100 사이즈의 빈 박스가 생성이 되는데 여기에 color 속성으로 색을 먹여주면 현재 크기만 있는 상자에 색이 먹여지면서 이러한 모습이 나타나게 된다.

또한 '모양'도 변할 수 있다고 말했는데 모양을 변하게 하려면 decoration 속성을 사용해야 한다.

여기서 주의해야 할 점은 decoration 속성을 사용하게 되면 기존의 Container 바로 밑의 위치해 있는 color 속성은 사용하지 못하게 된다. 그 이유로는 decoration 에 넣어놓은 BoxDecoration 위젯 안에도 color 속성이 있어 서로 겹쳐서 오류가 발생하기 때문으로 decoration 속성을 사용 시 반드시 기본 color 를 지우고 BoxDecoration 안에 있는 color 속성을 사용해줘야 한다.

Container(
  width: 100,
  height: 100,
  decoration: BoxDecoration( // decoration 속성 사용
    shape: BoxShape.circle,
    color: Colors.blue
  ),
),

현재 BoxDecoration 위젯 안에 있는 shape 라는 속성의 값을 BoxShape.circle 로 설정해 놔서 컨테이너의 모양이 동그랗게 바뀌게 된다.

BoxDecoration 위젯을 조금 더 알아보자면 외곽선을 추가할 수도 있고 모서리를 둥글게 할 수 도 있다.

Container(
  width: 100,
  height: 100,
  decoration: BoxDecoration(
    border: Border.all(width: 3), // stroke 추가
    borderRadius: BorderRadius.all(Radius.circular(15)), // 래디우스 추가
    color: Colors.blue
  ),
),

이 밖에도 gradient 라든가 boxShadow 값으로 그라디언트와 그림자를 먹여줄 수도 있다.

이 컨테이너의 모양을 진짜 막 바꿀 수도 있는데 trans 속성을 사용하여 Matrix4 위젯의 생성자를 사용해 주면 그러한 일들이 가능해진다.

(비스듬하게)

Container(
  width: 100,
  height: 100,
  color: Colors.blue,
  transform: Matrix4.skewX(12),
),

(회전)

Container(
  width: 100,
  height: 100,
  color: Colors.blue,
  transform: Matrix4.rotationZ(0.78),
),

위에서 알아본 것처럼 컨테이너 자체를 변형시킬 수도 있지만 child 속성을 활용하여 자식 위젯의 크기를 제한해주거나 위치를 잡아줄 수 도 있다.

Container(
  width: 100,
  height: 100,
  decoration: BoxDecoration(
    border: Border.all(width: 3),
    color: Colors.white
  ),
  child: Text('컨테이너'),
),

이렇게 작성하게 되면 일단 Text 위젯이 컨테이너의 자식이 되긴 한다만 조금 정렬이 이상하게 될 것이다.

이럴 때에는 Text를 Center 위젯으로 감싸는 방법도 좋겠지만 Container에 들어 있는 alignment 속성을 활용하여 자식 위젯의 정렬을 맞춰줄 수도 있다.

Container(
  alignment: Alignment.center, // center 정렬!
  width: 100,
  height: 100,
  decoration: BoxDecoration(
    border: Border.all(width: 3),
    color: Colors.white
  ),
  child: Text('컨테이너'),
),

그런데 만약 자식 위젯의 크기가 없다면 어떻게 될까? 컨테이너의 자식은 기본적으로 컨테이너 크기를 전부 잡아먹는다.

Container(
  alignment: Alignment.center, // center 정렬!
  width: 100,
  height: 100,
  decoration: BoxDecoration(
    border: Border.all(width: 3),
    color: Colors.white
  ),
  child: Container( // 이 위젯은 현재 크기가 없음
    decoration: BoxDecoration(
      color: Colors.red,
      shape: BoxShape.circle
    ),
  )
),

크기가 없지만 결과물은 부모 위젯인 Container의 크기를 그대로 상속받아 자신도 그 크기를 가지고 있는 모습이다.

이렇게 Container 위젯에 대해서 간단하게 알아보았다. 이 위젯은 정말 Flutter 위젯의 알파와 오메가인 만큼 이 언어로 개발을 시작하려 한다면 기본적으로 알고 있어야 하는 위젯이 되겠다. 암튼 도움이 되었길 바라며 마치겠다.

 

반응형