이번엔 페이지 만들기의 기본인 header, main, footer를 만들어볼겁니다.
물론 dart 언어는 HTML과 다르게
로 사용합니다.
기본적으로 앱의 형태는 상단과 중단과 하단이 있습니다.
(ex. TimeTree)
제일 위에 상단바가 있고,
중간에 메인 내용인 중단 부분,
아래에 네비게이션 바가 있습니다.
이 세 부분을 먼저 나누어야 합니다.
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold( // 상중하로 나눔
appBar: AppBar(), // 상단
body: Row(), // 중단
bottomNavigationBar: Row(), // 하단
)
);
}
}
MyApp 클래스 부분을 위와 같이 작성합니다. 저장 후 실행 시 그냥 하얀 화면만 나오게 되는데, 아직 내용을 아무것도 넣지 않아서 그렇습니다.
안보이지만 사실 이런 식으로 페이지가 나뉘어져 있습니다.
이제 가시적으로 확인하기 위해 각 부분의 괄호 안에 코드를 적어봅시다.
상단 부분의 괄호 안에 전에 배운 Text를 쓰겠습니다.
appBar: AppBar(
title:
Text(
style: TextStyle( // 이 부분은 글자 스타일 변경을 위한 코드입니다.
color: Colors.red,
),
'Title',
)
)
위와 같이 작성하게 될 경우 앱 윗 부분에 타이틀이 생깁니다.
보통 앱의 오른쪽 위에 메뉴 버튼이 있는데 이 부분은 IconButton
을 사용하면 됩니다.
먼저, Text 괄호가 끝나는 부분에 쉼표를 추가하고,
actions: <Widget>[
IconButton(
icon: const Icon(Icons.menu),
tooltip: 'menu',
onPressed: () {
print('menu click');
},
),
],
이 코드를 추가하면 됩니다.
actions
는 위젯에 액션을 추가하는 코드입니다.
tooltip
은 해당되는 아이콘에 마우스를 올릴 때 무슨 버튼인지 간략하게 설명해주는 코드입니다.
onPressed
는 눌렀을 때 중괄호 부분의 코드가 실행됩니다.
제 코드에서는 print를 하였기 때문에 버튼을 누르면 콘솔창에 print의 내용이 출력됩니다.
appBar: AppBar( // 상단
title:
Text(
style: TextStyle(
fontSize: 23,
color: Colors.red,
),
'Title',
),
actions: <Widget>[
IconButton(
icon: const Icon(Icons.menu),
tooltip: 'menu',
onPressed: () {
print('menu click');
},
),
],
),
중단의 경우 기능을 세로로 나열하는 것이 일반적이되, 일단 가로로 나열해보겠습니다.
(세로로 나열할 경우 body: Column( 내용 )
을 쓰면 됩니다.)
body에 아이콘을 출력해봅시다.
body: Row( // 중단
children: [
Icon(Icons.star),
Icon(Icons.star),
Icon(Icons.star),
Icon(Icons.star),
Icon(Icons.star),
]
),
아이콘을 추가하기 전에 Row
라는 부모가 있기 때문에
여러 아이콘을 추가하기 위해서는 children: []
이라는 코드를 작성해야 합니다.
대괄호 안에 아이콘들을 전에 배운 방법대로 작성하면 화면에 아이콘이 나타납니다.
하지만 저런 식으로 왼쪽부터 나열되면 굉장히 구리기 때문에 가운데 정렬을 해보겠습니다.
body: Row
안에 mainAxisAlignment: MainAxisAlignment.spaceEvenly,
를 적게 되면 가운데 정렬이 됩니다.
HTML의 Flex 기능과 유사한 모습을 보입니다.
MainAxisAlignment. 뒤에 여러 코드가 올 수 있습니다.
(Row/Column의 선택 여부에 따라 정렬이 다르게 됩니다.)
body: Row( // 중단
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Icon(Icons.star),
Icon(Icons.star),
Icon(Icons.star),
Icon(Icons.star),
Icon(Icons.star),
]
),
지금까지 내용을 응용한다면,
이런 식으로 배치하는 것도 가능합니다.
body: Column( // 중단
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Icon(Icons.star),
Icon(Icons.star),
Icon(Icons.star),
Icon(Icons.star),
Icon(Icons.star),
]
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Icon(Icons.apple),
Icon(Icons.apple),
Icon(Icons.apple),
Icon(Icons.apple),
]
),
]
),
하단은 중단과 같은 방법으로 배치하면 됩니다.
저는 기본 어플리케이션들과 비슷하게 만들어보았습니다.
bottomNavigationBar: Row( // 하단
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Icon(Icons.calendar_month),
Icon(Icons.alarm),
Icon(
Icons.home,
size: 40,
),
Icon(Icons.person),
Icon(Icons.settings),
]
),