기본 요소들 - 도형, 레이아웃, 텍스트

Flitter는 Flutter와 유사한 위젯 시스템을 제공하여 복잡한 UI를 쉽게 구성할 수 있습니다. 이 문서에서는 가장 기본적인 요소들인 도형, 레이아웃, 텍스트를 다루는 방법을 알아봅니다.

기본 도형 그리기

Flitter에서 도형은 Container 위젯과 BoxDecoration을 사용하여 만듭니다.

Container와 BoxDecoration

다양한 도형과 스타일을 만들어보세요.

기본 도형들

// 사각형
Container({
  width: 80,
  height: 80,
  decoration: new BoxDecoration({
    color: '#3B82F6'
  })
})

// 둥근 사각형
Container({
  width: 80,
  height: 80,
  decoration: new BoxDecoration({
    color: '#10B981',
    borderRadius: BorderRadius.circular(16)
  })
})

// 원
Container({
  width: 80,
  height: 80,
  decoration: new BoxDecoration({
    color: '#F59E0B',
    borderRadius: BorderRadius.circular(40)
  })
})

고급 스타일링

💡 팁
  • • Container의 decoration 속성으로 다양한 도형을 만들 수 있습니다
  • • borderRadius로 모서리를 둥글게 만들 수 있습니다
  • • Border로 테두리를 추가할 수 있습니다
  • • 색상은 HEX('#3B82F6') 또는 RGBA('rgba(0,0,0,0.5)') 형식을 사용합니다

Container 위젯

Container는 Flitter에서 가장 기본적이면서도 강력한 위젯입니다:

  • 크기 설정: width, height 속성으로 크기 지정
  • 색상: color 또는 decoration.color로 배경색 설정
  • 여백: padding과 margin으로 내부/외부 여백 설정
  • 장식: BoxDecoration으로 테두리, 둥근 모서리, 그림자 등 추가

BoxDecoration 활용

Container({
  decoration: new BoxDecoration({
    color: '#3B82F6',
    border: new Border({
      top: new BorderSide({ color: '#1E40AF', width: 2 }),
      // right, bottom, left도 동일하게 설정 가능
    }),
    borderRadius: BorderRadius.circular(8),
    // 또는 개별 모서리 설정
    borderRadius: BorderRadius.only({
      topLeft: Radius.circular(16),
      topRight: Radius.circular(16),
      bottomLeft: Radius.circular(0),
      bottomRight: Radius.circular(0)
    })
  })
})

레이아웃 시스템

Flitter는 세 가지 주요 레이아웃 위젯을 제공합니다.

레이아웃 위젯들

Row, Column, Stack을 사용하여 위젯을 배치하는 방법을 알아보세요.

결과

가로 방향으로 위젯을 배치합니다

코드

Row({
  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  crossAxisAlignment: CrossAxisAlignment.center,
  children: [
    Container({ 
      width: 60, 
      height: 60, 
      decoration: new BoxDecoration({ color: '#3B82F6' }) 
    }),
    Container({ 
      width: 60, 
      height: 80, 
      decoration: new BoxDecoration({ color: '#10B981' }) 
    }),
    Container({ 
      width: 60, 
      height: 100, 
      decoration: new BoxDecoration({ color: '#F59E0B' }) 
    })
  ]
})

Expanded 위젯 활용

Expanded 위젯을 사용하면 남은 공간을 자동으로 채울 수 있습니다.

Row({
  children: [
    Container({ 
      width: 60, 
      height: 60, 
      decoration: new BoxDecoration({ color: '#3B82F6' }) 
    }), // 고정 너비
    SizedBox({ width: 8 }),
    Expanded({
      child: Container({ 
        height: 60, 
        decoration: new BoxDecoration({ color: '#10B981' }) 
      }) // 남은 공간 채우기
    }),
    SizedBox({ width: 8 }),
    Container({ 
      width: 60, 
      height: 60, 
      decoration: new BoxDecoration({ color: '#F59E0B' }) 
    }) // 고정 너비
  ]
})
📐 정렬 속성 이해하기
MainAxisAlignment (주축 정렬):
  • • start: 시작점에 정렬
  • • end: 끝점에 정렬
  • • center: 중앙 정렬
  • • spaceBetween: 요소 사이 균등 배치
  • • spaceEvenly: 전체 공간 균등 배치
  • • spaceAround: 요소 주변 균등 배치
CrossAxisAlignment (교차축 정렬):
  • • start: 시작점에 정렬
  • • end: 끝점에 정렬
  • • center: 중앙 정렬
  • • stretch: 교차축 방향으로 늘리기

Row와 Column

Row는 자식 위젯들을 가로로, Column은 세로로 배치합니다:

// 가로 배치
Row({
  mainAxisAlignment: MainAxisAlignment.spaceBetween, // 주축 정렬
  crossAxisAlignment: CrossAxisAlignment.center,     // 교차축 정렬
  children: [/* 위젯들 */]
})

// 세로 배치
Column({
  mainAxisAlignment: MainAxisAlignment.start,
  crossAxisAlignment: CrossAxisAlignment.stretch,
  children: [/* 위젯들 */]
})

Stack과 Positioned

Stack은 위젯들을 겹쳐서 배치할 때 사용합니다:

Stack({
  children: [
    Container({ /* 배경 */ }),
    Positioned({
      top: 10,
      left: 10,
      child: Container({ /* 절대 위치 지정 */ })
    })
  ]
})

Expanded와 Flexible

남은 공간을 채우거나 비율에 따라 공간을 분배할 때 사용합니다:

Row({
  children: [
    Container({ width: 100 }), // 고정 너비
    Expanded({
      flex: 2, // 2배의 공간 차지
      child: Container({ /* 남은 공간 채우기 */ })
    }),
    Expanded({
      flex: 1, // 1배의 공간 차지
      child: Container({ /* 남은 공간 채우기 */ })
    })
  ]
})

텍스트 처리

Flitter의 Text 위젯은 다양한 스타일링과 레이아웃 옵션을 제공합니다.

텍스트 스타일링과 처리

다양한 텍스트 스타일과 오버플로우 처리 방법을 알아보세요.

텍스트 스타일링

Text('스타일이 적용된 텍스트', {
  style: new TextStyle({
    fontSize: 18,
    fontWeight: 'bold',
    fontStyle: 'italic',
    fontFamily: 'monospace',
    letterSpacing: 2,
    color: '#3B82F6'
  })
})

텍스트 정렬

텍스트 오버플로우 처리

// 자동 줄바꿈
Text('긴 텍스트가 자동으로 줄바꿈됩니다')

// 줄 수 제한과 말줄임표
Text('매우 긴 텍스트...', {
  maxLines: 2,
  overflow: TextOverflow.ellipsis
})
💡 텍스트 처리 팁
  • • TextStyle로 폰트 크기, 굵기, 색상 등을 설정할 수 있습니다
  • • textAlign으로 텍스트 정렬 방향을 설정합니다
  • • maxLines와 overflow로 긴 텍스트를 처리합니다
  • • Container의 너비를 설정하면 자동으로 줄바꿈이 됩니다
  • • letterSpacing으로 글자 간격을 조절할 수 있습니다

TextStyle 속성

Text('스타일이 적용된 텍스트', {
  style: new TextStyle({
    fontSize: 18,          // 글자 크기
    fontWeight: 'bold',    // 굵기: 'normal', 'bold'
    fontStyle: 'italic',   // 스타일: 'normal', 'italic'
    fontFamily: 'Arial',   // 폰트 패밀리
    color: '#3B82F6',      // 색상
    letterSpacing: 1.5,    // 글자 간격
    wordSpacing: 2.0,      // 단어 간격
    height: 1.5,           // 줄 높이
    decoration: 'underline' // 'none', 'underline', 'overline', 'lineThrough'
  })
})

텍스트 정렬과 오버플로우

Container({
  width: 200,
  child: Text('긴 텍스트가 들어갑니다...', {
    textAlign: TextAlign.center,    // 정렬: left, right, center, justify
    maxLines: 2,                     // 최대 줄 수
    overflow: TextOverflow.ellipsis, // 오버플로우 처리: clip, fade, ellipsis
  })
})

실전 예제: 카드 컴포넌트 만들기

지금까지 배운 내용을 활용하여 카드 컴포넌트를 만들어봅시다:

Container({
  width: 300,
  padding: EdgeInsets.all(16),
  decoration: new BoxDecoration({
    color: '#FFFFFF',
    borderRadius: BorderRadius.circular(12),
    border: new Border({
      top: new BorderSide({ color: '#E5E7EB', width: 1 }),
      right: new BorderSide({ color: '#E5E7EB', width: 1 }),
      bottom: new BorderSide({ color: '#E5E7EB', width: 1 }),
      left: new BorderSide({ color: '#E5E7EB', width: 1 })
    })
  }),
  child: Column({
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
      Text('카드 제목', {
        style: new TextStyle({
          fontSize: 20,
          fontWeight: 'bold',
          color: '#1F2937'
        })
      }),
      SizedBox({ height: 8 }),
      Text('카드 내용이 들어갑니다. 여러 줄의 텍스트를 포함할 수 있습니다.', {
        style: new TextStyle({
          fontSize: 14,
          color: '#6B7280'
        })
      }),
      SizedBox({ height: 16 }),
      Row({
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          Container({
            padding: EdgeInsets.symmetric({ horizontal: 12, vertical: 6 }),
            decoration: new BoxDecoration({
              color: '#3B82F6',
              borderRadius: BorderRadius.circular(6)
            }),
            child: Text('액션', {
              style: new TextStyle({
                fontSize: 14,
                color: '#FFFFFF',
                fontWeight: 'bold'
              })
            })
          })
        ]
      })
    ]
  })
})

다음 단계

기본 요소들을 마스터했다면, 기본 상호작용에서 사용자 입력을 처리하는 방법을 알아보세요.

요약

  • Container: 크기, 색상, 여백, 장식을 가진 기본 컨테이너
  • BoxDecoration: 테두리, 둥근 모서리 등 시각적 장식
  • Row/Column: 가로/세로 방향 레이아웃
  • Stack: 위젯 겹치기
  • Text: 다양한 스타일과 정렬 옵션을 가진 텍스트
  • Expanded: 남은 공간 채우기