UI 구성 요소
위젯(Widget)
Flutter에서 위젯은 UI를 구성하는 기본 요소로 안드로이드의 Material Design이나 iOS의 Cupertino Design에서 제공하는 button, image, input field 등과 같은 UI 요소들을 Flutter에서는 위젯이라고 한다.
컴포넌트(Component)
컴포넌트는 위젯의 모음이나 위젯 자체를 의미하며 여러 위젯을 조합하여 하나의 기능적 단위로 만든 것을 컴포넌트라고 할 수 있다. Flutter에서는 모든 UI 요소가 위젯이기 때문에, 컴포넌트와 위젯이 종종 혼용되어 사용되곤 한다.
디자인 시스템
Material Design
구글이 안드로이드를 위해 개발한 디자인 언어로 Flutter에서는
MaterialApp
위젯을 통해 Material Design 스타일의 앱을 구현할 수 있다.MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Material Design App')),
body: Center(child: ElevatedButton(onPressed: () {}, child: Text('Button'))),
),
)
Cupertino Design
애플이 iOS를 위해 개발한 디자인 언어로 Flutter에서는
CupertinoApp
위젯을 통해 iOS 스타일의 앱을 구현할 수 있다.CupertinoApp(
home: CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(middle: Text('Cupertino Design App')),
child: Center(child: CupertinoButton(onPressed: () {}, child: Text('Button'))),
),
)
Flutter Widget Index
: Flutter Widget Index는 Flutter에서 제공하는 모든 위젯의 목록과 설명을 제공하는 공식 참고 자료
Inset (여백 영역)
: 레이아웃의 구성요소로 그림을 그릴 수 없는 영역(UI 요소가 표시되지 않는 화면의 여백 영역)을 의미합니다.
노치(notch : 아이폰 m자 탈모…)나 홈 인디케이터가 있는 영역, 시스템 상태 표시줄 영역 등이 이에 해당한다.
Flutter에서는
SafeArea
위젯을 사용하여 이러한 inset 영역을 고려한 UI를 구현가능하다:SafeArea(
child: Container(
// 여기에 내용을 배치하면 inset 영역을 피해서 표시된다.
),
)
STL (Stateless Widget), STF (Stateful Widget)
- Stateless Widget (STL) - 상태가 변하지 않는 정적인 위젯 Stateless Widget은 한 번 생성되면 변경되지 않는 불변(immtable) 위젯이다.
class MyStatelessWidget extends StatelessWidget {
final String text;
const MyStatelessWidget({Key? key, required this.text}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(20.0),
child: Text(text),
);
}
}
- Stateful Widget (STF) - 상태가 변할 수 있는 동적인 위젯
class CounterButton extends StatefulWidget {
const CounterButton({Key? key}) : super(key: key);
@override
_CounterButtonState createState() => _CounterButtonState();
}
class _CounterButtonState extends State<CounterButton> {
int _count = 0;
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () {
setState(() {
_count++;
});
},
child: Text('클릭 횟수: $_count'),
);
}
}
Share article