1. HomePage(메인 페이지)
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
//HomePage로 한 이유는 순수하게 디자인 하기 위해서,
home: HomePage(),
);
}
}
2. Row() _menu, Icon
Row _menu() {
return Row(
children: [
//_하면 다른 곳에서 쓰지 못한다. 우리가 만든 메소드는 m을 붙이자
//재사용 가능한 메소드, 처음부터 만들고 메소드를 만든다.
_mIcon(Icons.food_bank, "ALL"),
SizedBox(width: 25),
_mIcon(Icons.emoji_food_beverage, "Coffee"),
SizedBox(width: 25),
_mIcon(Icons.fastfood, "Burger"),
SizedBox(width: 25),
_mIcon(Icons.local_pizza, "Pizza"),
],
);
}
Container _mIcon(IconData mIcon, String text) {
return Container(
width: 60,
height: 80,
decoration: BoxDecoration(
//border는 추상 클래스라서 생성자를 못 한다.
border: Border.all(color: Colors.black12),
borderRadius: BorderRadius.circular(30)),
//안에 하나만 가질 수 있다.
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
mIcon,
color: Colors.redAccent,
size: 30,
),
SizedBox(height: 5),
Text(
"$text",
style: TextStyle(
color: Colors.black87,
fontWeight: FontWeight.bold,
),
),
],
),
);
}

코드설명
- Container:
Container
위젯은 60dp 너비와 80dp 높이를 가지며, 테두리와 둥근 모서리가 적용된 BoxDecoration이 포함되어 있습니다.border: Border.all(color: Colors.black12)
는 연한 검정색 테두리를 만들며,BorderRadius.circular(30)
은 모서리를 30dp 만큼 둥글게 만듭니다.
- Column:
Container
내부에는Column
을 사용하여 아이콘과 텍스트가 수직으로 배치됩니다.mainAxisAlignment: MainAxisAlignment.center
는 아이콘과 텍스트를 세로 중앙에 배치합니다.
- Icon:
- 전달받은
mIcon
을 빨간색(Colors.redAccent
)과 30dp 크기로 표시합니다. 이는 주로 상단에 배치된 큰 아이콘으로 사용됩니다.
- SizedBox:
SizedBox(height: 5)
는 아이콘과 텍스트 사이에 5dp의 간격을 제공합니다. 이를 통해 각 위젯이 서로 떨어져 보이게 배치됩니다.
결론
이 함수는 아이콘과 텍스트를 수직으로 정렬한 작은 UI 요소를 만들기 위해 사용됩니다. 사용 사례로는 네비게이션 메뉴나 카드 형식의 아이템에서 주로 사용될 수 있으며, 아이콘과 텍스트를 함께 배치하여 직관적인 사용자 인터페이스를 구성하는 데 적합합니다.
3. AppBar
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: [
Icon(Icons.search),
SizedBox(width: 16),
Icon(CupertinoIcons.heart, color: Colors.redAccent),
SizedBox(width: 16)
],

4. ListView
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: ListView(
children: [
_title(),
SizedBox(height: 10),
_menu(),
SizedBox(height: 10),
RecipeItem("burger.jpeg", "burger"),
RecipeItem("coffee.jpeg", "coffee"),
RecipeItem("pizza.jpeg", "pizza"),
],
),
),
);
}

코드설명
ListView:
ListView
는 스크롤 가능한 리스트를 구성하는 위젯입니다. 이 경우children
으로 여러 위젯을 포함하고 있어 스크롤 가능한 화면을 구성합니다.
title(), _menu():
_title()
와_menu()
는 각각의 위젯을 반환하는 사용자 정의 함수입니다. 이 함수들이 실제로 어떤 위젯을 반환하는지 구체적인 내용은 코드에서 제공되지 않았지만, 이 함수들은 제목과 메뉴와 관련된 레이아웃을 포함할 가능성이 높습니다.
결론
이 코드에서는
ListView
를 사용하여 여러 개의 항목을 세로로 나열하고, Padding
과 SizedBox
로 간격을 주어 정돈된 레이아웃을 구성하고 있습니다. 각 항목(_title
, _menu
, RecipeItem
)은 사용자 정의 함수 및 위젯을 통해 깔끔하게 분리된 구조로 구현되어 있으며, 이로 인해 코드의 가독성과 유지보수성이 높아집니다.5. RecipeItem
//RecipeItem 컬럼
class RecipeItem extends StatelessWidget {
//이렇게 쓰는 방법은 const만 지우면 가능하다.
String imageName;
String text;
//생성자 , new를 백번해도 한번만 뜬다. 상태가 없으면 const를 지운다.
// const RecipeItem();
RecipeItem(this.imageName, this.text);
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AspectRatio(
//가로가 2 세로가 1
aspectRatio: 3 / 2,
child: ClipRRect(
borderRadius: BorderRadius.circular(20),
child: Image.asset("assets/$imageName", fit: BoxFit.cover),
),
),
SizedBox(height: 10),
Text(
"$text",
style: TextStyle(fontSize: 20),
),
Text(
"Have you ever made your own $text? Once you've tried a homemade $text, you'll never go back.",
style: TextStyle(color: Colors.grey, fontSize: 12),
),
],
),
);
}

코드설명
Column:
Column
은 위젯을 수직으로 정렬하는데 사용되며, 레시피 이미지와 설명 텍스트가 차례대로 나옵니다.
crossAxisAlignment: CrossAxisAlignment.start
는 모든 자식 요소들이 왼쪽 정렬되도록 설정합니다.
AspectRatio:
AspectRatio
위젯은 가로와 세로의 비율을 3:2로 설정하여 이미지의 비율을 유지하며 표시합니다.
ClipRRect
를 사용하여 이미지의 모서리를 20dp로 둥글게 처리한 후,Image.asset
으로 이미지를 불러옵니다.BoxFit.cover
로 이미지를 화면에 맞게 조정해 잘리지 않도록 합니다.
코드 구조의 의미:
- 이 구조는 레시피에 대한 이미지와 설명을 하나의 카드 형태로 화면에 표시하는 데 사용됩니다.
RecipeItem
은 각기 다른 레시피 항목을 동일한 레이아웃 구조로 재사용할 수 있도록 구성되어 있으며, 이미지 파일과 레시피 이름을 인자로 받아 다양한 레시피 아이템을 쉽게 생성할 수 있습니다.
Share article