UI Toolkit인 Flutter는, Layout을 설정 할 때 선언형 UI 형태를 표방합니다.

여기서 선언형 UI란, UI를 구성하는 코드를 각각 객체화 하여, 해당 코드의 선언 / 할당을 통해 원하는 위치 / 크기로 UI를 구축 할 수 있는 형태를 말합니다.

반대적 표현으로는 명령형 UI가 있고, 전통적인 HTML / XML을 통해 UI를 그리는 형태를 예로 들 수 있습니다.

<html>
<head>
...
</head>
<body>
	<div>
		대표적인 명령형 UI, HTML
		<ul>
			<li id="li_1">이렇게 태그를 사용하면</li>
			<li id="li_2">해당 li를 재활용 하고자 할 때</li>
			<li id="li_3">굉장히 난감하죠?</li>
		</ul>
	</div>
</body>
<script>
	document.getElementById('li_1').style.fontSize = 
			'x-large';
	document.getElementById('li_2').style.fontSize = 
			'large';
	document.getElementById('li_3').style.fontSize = 
			'normal';
</script>
</html>

Untitled

위의 사례로도 봤을 때, 코드의 활용도 / 재사용성 등에서 많이 떨어지게 되는 형태이기 때문에, 최근들어 개발 트랜드가 선언형 UI 형태로 변모하고 있다고 할 수 있습니다.

MaterialApp(
	home: Scaffold(
		appBar: AppBar(
			title: Text('선언형 UI 예시'),
		),
		body: Center(
			child: Text('이것이 선언형 UI다.'),
		),
	)
);

Untitled

단순히 사전에 정의 된 객체를 일종의 트리 형태로 쌓아가면서 UI를 구축 하기 때문에, 코드를 재사용하거나 새로 정의하는 Widget(Component)를 활용하여 생산성을 크게 높일 수 있는 것이 특징입니다.

대표적인 사례로는 Flutter / Swift UI / Jetpack Compose / React 등이 있습니다.

그럼 아래부터는 Flutter 내에 UI를 구성할 때, 대표적으로 사용되는 Widget들에 대해 이야기 해 볼까요?

Box

Container

SizedBox / Padding

Flex (Flexible / Expanded)

Stack

Content

Text

Icon

Image

Interact

Button