inblog logo
|
Uni
    Flutter

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

    Recipeapp
    홍윤's avatar
    홍윤
    Oct 01, 2024
    7. Flutter 수업- Android Studio로 Recipeapp 만들기
    Contents
    1. HomePage(메인 페이지)2. Row() _menu, Icon3. AppBar4. ListView5. RecipeItem
     

    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를 사용하여 여러 개의 항목을 세로로 나열하고, 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), ), ], ), ); }
    notion image
    💡

    코드설명

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

    코드 구조의 의미:

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

    Uni

    RSS·Powered by Inblog