개요
Flutter에서 위젯의 크기를 제어하는 방법은 다양합니다. 그 중 가장 많이 사용되는 ConstrainedBox와 SizedBox의 차이점과 각각의 사용 사례에 대해 알아보겠습니다.
SizedBox의 이해
기본 사용법
// 고정 크기 지정
SizedBox(
width: 100,
height: 50,
child: Container(
color: Colors.blue,
),
)
// 간격 생성
SizedBox(height: 10) // 세로 간격
SizedBox(width: 10) // 가로 간격
// 최대 크기로 확장
SizedBox.expand(
child: Container(
color: Colors.blue,
),
)
SizedBox의 특징
- 정확한 크기를 지정할 때 사용
- 간단한 간격을 만들 때 유용
- child가 없을 경우 빈 공간으로 사용
- 성능상 가장 가벼운 위젯 중 하나
ConstrainedBox의 이해
기본 사용법
ConstrainedBox(
constraints: BoxConstraints(
minWidth: 100,
maxWidth: 200,
minHeight: 50,
maxHeight: 100,
),
child: Container(
color: Colors.blue,
),
)
// 유용한 생성자들
ConstrainedBox(
constraints: BoxConstraints.tightFor(width: 100, height: 100),
child: Container(color: Colors.blue),
)
ConstrainedBox(
constraints: BoxConstraints.loose(Size(200, 100)),
child: Container(color: Colors.blue),
)
ConstrainedBox의 특징
- 최소/최대 크기 제약 설정 가능
- 자식 위젯의 크기를 유연하게 제어
- 복잡한 레이아웃 제약 조건 설정 가능
실제 사용 예시
SizedBox 활용
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('First Item'),
SizedBox(height: 16), // 간격 추가
Container(
color: Colors.blue,
child: SizedBox(
width: 100,
height: 100,
child: Center(
child: Text('Fixed Size'),
),
),
),
SizedBox(height: 16), // 간격 추가
Text('Last Item'),
],
);
}
}
ConstrainedBox 활용
class FlexibleWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
ConstrainedBox(
constraints: BoxConstraints(
minHeight: 50,
maxHeight: 200,
),
child: Container(
color: Colors.green,
child: Text('This box can grow between 50 and 200'),
),
),
ConstrainedBox(
constraints: BoxConstraints.tightFor(
width: double.infinity,
height: 100,
),
child: Card(
child: Center(
child: Text('Full width, fixed height'),
),
),
),
],
);
}
}
주요 차이점과 선택 기준
SizedBox 사용 시나리오
정확한 크기가 필요할 때
// 고정 크기 버튼
SizedBox(
width: 200,
height: 50,
child: ElevatedButton(
onPressed: () {},
child: Text('Fixed Size Button'),
),
)
간단한 간격이 필요할 때
Column(
children: [
Text('Item 1'),
SizedBox(height: 8), // 작은 간격
Text('Item 2'),
SizedBox(height: 16), // 중간 간격
Text('Item 3'),
SizedBox(height: 24), // 큰 간격
Text('Item 4'),
],
)
ConstrainedBox 사용 시나리오
유동적인 크기 제약이 필요할 때
ConstrainedBox(
constraints: BoxConstraints(
minWidth: 100,
maxWidth: MediaQuery.of(context).size.width * 0.8,
minHeight: 50,
),
child: Container(
padding: EdgeInsets.all(16),
child: Text('This box adapts to content'),
),
)
반응형 레이아웃 구현 시
ConstrainedBox(
constraints: BoxConstraints(
maxWidth: 600, // 태블릿/데스크톱에서 최대 너비 제한
),
child: ListView(
children: [
// 리스트 아이템들
],
),
)
성능 고려사항
SizedBox
// 권장: 간단하고 효율적
SizedBox(width: 100, height: 100)
// 비권장: 불필요한 중첩
Container(
width: 100,
height: 100,
)
ConstrainedBox
// 권장: 필요한 경우만 사용
ConstrainedBox(
constraints: BoxConstraints(maxWidth: 200),
child: Text('Limited width text'),
)
// 비권장: 불필요한 제약 사용
ConstrainedBox(
constraints: BoxConstraints.tightFor(width: 100, height: 100),
child: Container(), // SizedBox를 사용하는 것이 더 효율적
)
마치며
- SizedBox는 정확한 크기나 간격이 필요할 때 사용
- ConstrainedBox는 유연한 크기 제약이 필요할 때 사용
- 성능을 고려할 때는 가능한 한 간단한 위젯을 선택
- 레이아웃의 목적과 요구사항에 따라 적절한 위젯 선택이 중요
'Language > Flutter' 카테고리의 다른 글
[Flutter] Warning: Pub installs executables into $HOME/.pub-cache/bin, which is not on your path. 오류 해결방법 (0) | 2024.11.30 |
---|---|
[Flutter] 도넛차트를 만들어보자 (0) | 2024.11.27 |
[Flutter] 부모 위젯이 자식 위젯의 메소드호출하기 (0) | 2024.11.24 |
[Flutter] /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: AAPT: error: file failed to compile. 에러 해결방법 (0) | 2024.11.23 |
[Flutter] 앱 아이콘 변경 (0) | 2024.11.22 |