7. Flutter 수업- Android Studio로 Recipeapp 만들기

Recipeapp
홍윤's avatar
Oct 01, 2024
7. Flutter 수업- Android Studio로 Recipeapp 만들기
 

1. HomePage(메인 페이지)

class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, //HomePage로 한 이유는 순수하게 디자인 하기 위해서, home: HomePage(), ); } }
💡

코드설명

home: HomePage():
  • home은 앱이 실행될 때 가장 먼저 표시될 화면을 정의하는 속성입니다. 여기서는 **HomePage*라는 사용자 정의 위젯이 첫 화면으로 설정되어 있습니다.
  • HomePage는 사용자 정의 위젯으로, 앱의 메인 디자인을 위한 화면이 될 수 있습니다. 이 클래스는 앱의 홈 화면 레이아웃과 디자인을 담당합니다.

결론

이 코드는 Flutter 앱의 기본 구조를 설정하고, 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, ), ), ], ), ); }
notion image
💡

코드설명

  • 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) ],
notion image

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"), ], ), ), ); }
notion image
💡

코드설명

ListView:
  • ListView는 스크롤 가능한 리스트를 구성하는 위젯입니다. 이 경우 children으로 여러 위젯을 포함하고 있어 스크롤 가능한 화면을 구성합니다.
title(), _menu():
  • _title()_menu()는 각각의 위젯을 반환하는 사용자 정의 함수입니다. 이 함수들이 실제로 어떤 위젯을 반환하는지 구체적인 내용은 코드에서 제공되지 않았지만, 이 함수들은 제목메뉴와 관련된 레이아웃을 포함할 가능성이 높습니다.

결론

이 코드에서는 ListView를 사용하여 여러 개의 항목을 세로로 나열하고, PaddingSizedBox로 간격을 주어 정돈된 레이아웃을 구성하고 있습니다. 각 항목(_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), ), ], ), ); }
notion image
💡

코드설명

Column:
  • Column은 위젯을 수직으로 정렬하는데 사용되며, 레시피 이미지와 설명 텍스트가 차례대로 나옵니다.
  • crossAxisAlignment: CrossAxisAlignment.start는 모든 자식 요소들이 왼쪽 정렬되도록 설정합니다.
AspectRatio:
  • AspectRatio 위젯은 가로와 세로의 비율을 3:2로 설정하여 이미지의 비율을 유지하며 표시합니다.
  • ClipRRect를 사용하여 이미지의 모서리를 20dp로 둥글게 처리한 후, Image.asset으로 이미지를 불러옵니다. BoxFit.cover로 이미지를 화면에 맞게 조정해 잘리지 않도록 합니다.

코드 구조의 의미:

  • 이 구조는 레시피에 대한 이미지와 설명을 하나의 카드 형태로 화면에 표시하는 데 사용됩니다.
  • RecipeItem은 각기 다른 레시피 항목을 동일한 레이아웃 구조로 재사용할 수 있도록 구성되어 있으며, 이미지 파일과 레시피 이름을 인자로 받아 다양한 레시피 아이템을 쉽게 생성할 수 있습니다.
Share article

Uni