Flutter 개발 입문: 위젯, 레이아웃, 그리고 핵심 개념 🚀
Flutter는 크로스 플랫폼 앱 개발에 많이 사용되는 프레임워크임.
Flutter 개발을 시작할 때 알아야 할 기본적인 내용들을 정리했음.
📚 1. Flutter 위젯의 종류
Flutter는 모든 것을 위젯으로 다룸. 위젯은 화면에 보이는 UI 요소뿐만 아니라 레이아웃, 상호작용 등 모든 것을 포함함.
StatefulWidget: 값이 바뀌면 다시 렌더링할 수 있는 위젯임.setState함수를 사용하여 위젯의 상태를 변경하고 UI를 업데이트할 수 있음.class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Text('Counter: $_counter'),
ElevatedButton(
onPressed: _incrementCounter,
child: Text('Increment'),
),
],
);
}
}StatelessWidget: 처음 한 번만 렌더링할 수 있는 위젯임. 한 번 그려지면 UI가 변경되지 않음.class MyStatelessWidget extends StatelessWidget {
final String title;
MyStatelessWidget({required this.title});
@override
Widget build(BuildContext context) {
return Text(title);
}
}
🎨 2. 위젯 배치 및 정렬
Flutter에서 위젯을 배치하고 정렬하는 데 사용되는 주요 개념들임.
child: 하위 위젯이 한 개일 때 사용함.Container(
child: Text('Hello World'),
)children: 하위 위젯이 여러 개일 때 사용함.Column(
children: [
Text('First item'),
Text('Second item'),
],
)AspectRatio: 이미지 등의 비율을 맞출 때 사용함.AspectRatio(
aspectRatio: 16 / 9, // 16:9 비율
child: Image.network('https://example.com/image.jpg'),
)Stack: 위젯이 위로 겹쳐서 쌓이는 방식임.Stack(
children: <Widget>[
Container(color: Colors.red, width: 100, height: 100),
Container(color: Colors.blue, width: 80, height: 80),
],
)Positioned:Stack위젯 안에서 쌓인 위젯의 위치를 조정할 때 사용함.Stack(
children: <Widget>[
Container(color: Colors.red, width: 200, height: 200),
Positioned(
top: 20,
left: 20,
child: Container(color: Colors.blue, width: 100, height: 100),
),
],
)
📏 3. EdgeInsets 이해하기: 마진과 패딩
Flutter에서는 CSS나 JavaScript와 다르게 EdgeInsets 클래스를 사용하여 margin과 padding을 지정함.
EdgeInsets.all(5): 모든 방향(상하좌우)에 5만큼의 여백을 줌.Padding(
padding: EdgeInsets.all(5.0),
child: Text('All padding'),
)EdgeInsets.only(top: 5): 특정 영역, 예를 들어top에만 5만큼의 여백을 줌.Padding(
padding: EdgeInsets.only(top: 5.0),
child: Text('Top padding only'),
)EdgeInsets.fromLTRB(5, 10, 0, 0): 각각 왼쪽(Left), 위(Top), 오른쪽(Right), 아래(Bottom) 순서로 여백을 지정함 (예: 왼쪽 5, 위 10).Padding(
padding: EdgeInsets.fromLTRB(5.0, 10.0, 0.0, 0.0),
child: Text('LTRB padding'),
)EdgeInsets.symmetric(horizontal: 5, vertical: 10): 가로(왼쪽, 오른쪽)로 5, 세로(위, 아래)로 10만큼의 여백을 줌.Padding(
padding: EdgeInsets.symmetric(horizontal: 5.0, vertical: 10.0),
child: Text('Symmetric padding'),
)
⚙️ 4. 위젯 정렬 및 크기 조절
mainAxisAlignment: 주 축(main axis)을 따라 위젯들을 정렬함. (예:Row에서는 가로,Column에서는 세로)Row(
mainAxisAlignment: MainAxisAlignment.center, // 가로 중앙 정렬
children: [Text('A'), Text('B')],
)crossAxisAlignment: 교차 축(cross axis)을 따라 위젯들을 정렬함. (예:Row에서는 세로,Column에서는 가로)Column(
crossAxisAlignment: CrossAxisAlignment.start, // 세로 시작점 정렬
children: [Text('A'), Text('B')],
)mainAxisSize: 주 축의 크기를 조절함.Row(
mainAxisSize: MainAxisSize.min, // 필요한 최소한의 공간만 차지
children: [Text('A'), Text('B')],
)Expanded: 자식 위젯이 부모 위젯의 남은 공간을 확장하여 채우도록 함.Row(
children: [
Text('Fixed Width'),
Expanded(
child: Text('Expanded Text that takes remaining space'),
),
],
)Flexible: 자식 위젯이 부모 위젯의 남은 공간을 유연하게 채우도록 하지만, 필요한 공간만큼만 차지할 수 있도록 함.Row(
children: [
Text('Fixed Width'),
Flexible(
child: Text('Flexible Text that takes available space'),
),
],
)
답글 남기기