메뉴 바를 눌렀을때 Drawer이 나오도록 만든다
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: HomePage(), // 홈페이지 보여주기 모듈화를 위해 밑에만들어준 class 에 body를 작성
);
}
}
class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
// 음식 사진 데이터
List<Map<String, dynamic>> dataList = [
{
"category": "수제버거",
"imgUrl": "https://i.ibb.co/VtK43vv/burger.jpg",
},
{
"category": "건강식",
"imgUrl": "https://i.ibb.co/2KbN5pV/soup.jpg",
},
{
"category": "한식",
"imgUrl": "https://i.ibb.co/KXJD0rN/korean-meals.jpg",
},
{
"category": "디저트",
"imgUrl": "https://i.ibb.co/9Yn3t0w/tiramisu.jpg",
},
{
"category": "피자",
"imgUrl": "https://i.ibb.co/P9nKtt2/pizza.jpg",
},
{
"category": "볶음밥",
"imgUrl": "https://i.ibb.co/3svVzM1/shakshuka.jpg",
},
];
// 화면에 보이는 영역 return 뒤에 작성
return Scaffold(
//앱바
appBar: AppBar(
elevation: 0, // 그림자 없애기
backgroundColor: Colors.white, // 배경 색상
centerTitle: false, // title 중앙 정렬
iconTheme: IconThemeData(color: Colors.black), // app bar icon color
title: Text( //title
"Food Recipe",
style: TextStyle(
color: Colors.black,
fontSize: 28,
fontWeight: FontWeight.bold,
),
),
actions: [
/// My Button
IconButton(
onPressed: () {
print("go my page");
},
icon: Icon(
Icons.person_outline,
),
),
],
),
//body 영역
body: Column(
children: [
/// 검색
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
decoration: InputDecoration(
hintText: "상품을 검색해주세요.",
border: OutlineInputBorder( //상하좌우 테두리
borderSide: BorderSide(color: Colors.black),
),
// 돋보기 아이콘
suffixIcon: IconButton(
icon: Icon(Icons.search),
onPressed: () {
print("돋보기 아이콘 클릭");
},
),
),
),
),
Divider(height: 1), //나누는선
/// 카테고리 목록
Expanded( //부모의 남은 부분을 전부 채운다.
child: ListView.builder(
// 보여주려는 데이터 개수
itemCount: dataList.length,
// itemCount 만큼 반복되며 화면에 보여주려는 위젯
// index가 0부터 dataList.length - 1까지 증가하며 전달됩니다.
itemBuilder: (context, index) { //context 현재위젯트리의 위치정보
// dataList에서 index에 해당하는 data 꺼내기
Map<String, dynamic> data = dataList[index];
String category = data["category"];
String imgUrl = data["imgUrl"];
// 카드 형태의 위젯으로 return
return Card(
margin: const EdgeInsets.all(8),
// 위젯들을 위로 중첩하기 위해 Stack 위젯 사용
child: Stack(
alignment: Alignment.center, // 중앙 정렬
children: [
/// 배경 이미지
Image.network(
imgUrl,
width: double.infinity, // 가득 채우기
height: 120,
fit: BoxFit.cover, // 이미지 비율을 유지하며 주어진 width와 height를 가득 채우기
),
/// 배경 위에 글씨가 보이도록 반투명한 박스 추가
Container(
width: double.infinity,
height: 120,
color: Colors.black.withOpacity(0.5), // 투명도 50%
),
/// 카테고리
Text(
category,
style: TextStyle(
color: Colors.white,
fontSize: 36,
),
),
],
),
);
},
),
),
],
),
/// AppBar 왼쪽에 아이콘을 누를 때 왼쪽에서 오른쪽으로 나오는 위젯
/// 해당 위젯을 추가하면 AppBar 왼쪽에 아이콘이 자동으로 추가됨
drawer: Drawer(
child: Column(
children: [
// Drawer 윗 부분
DrawerHeader(
margin: const EdgeInsets.all(0),
decoration: BoxDecoration(
color: Colors.amber,
),
child: SizedBox(//stack 을 쓰지 않아도 겹칠수는 있다.
width: double.infinity, // 가득 채우기
child: Column(
children: [
/// 동그란 배경
CircleAvatar(
radius: 36, //원의반지름
backgroundColor: Colors.white,
child: Padding(
padding: const EdgeInsets.all(8.0),
/// 이미지
child: Image.network(
"https://i.ibb.co/CwzHq4z/trans-logo-512.png",
width: 62,
),
),
),
/// 닉네임 상단 여백
SizedBox(height: 16),
/// 닉네임
Text(
"닉네임",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
/// 이메일
Text(
"hello@world.com",
style: TextStyle(
fontSize: 16,
color: Colors.black,
),
),
],
),
),
),
/// 이벤트 배너
// 특정 비율로 위젯을 보여주기
AspectRatio(
aspectRatio: 12 / 4, // 가로 : 세로 = 12 : 4 (이미지를 12:4로 준비했어요)
/// 이벤트 배너 리스트
/// 스크롤을 하는데, 특정 항목이 스냅이 걸리도록 만들고 싶은 경우 PageView를 사용해요.
child: PageView(
children: [
Image.network(
"https://i.ibb.co/Q97cmkg/sale-event-banner1.jpg",
),
Image.network(
"https://i.ibb.co/GV78j68/sale-event-banner2.jpg",
),
Image.network(
"https://i.ibb.co/R3P3RHw/sale-event-banner3.jpg",
),
Image.network(
"https://i.ibb.co/LRb1VYs/sale-event-banner4.jpg",
),
],
),
),
/// 구매 내역
ListTile( //높이가 고정된 1개의 행,텍스트,아이콘 포함
title: Text(
'구매내역',
style: TextStyle(fontSize: 18),
),
trailing: Icon(
Icons.arrow_forward_ios,
color: Colors.black,
),
onTap: () {
// 클릭시 drawer 닫기
Navigator.pop(context);
},
),
/// 레시피 공유하기
ListTile(
title: Text(
'저장한 레시피',
style: TextStyle(fontSize: 18),
),
trailing: Icon(
Icons.arrow_forward_ios,
color: Colors.black,
),
onTap: () {
// 클릭시 drawer 닫기
Navigator.pop(context);
},
),
],
),
),
);
}
}
//주석으로 코드에 대한설명 + 위젯에 대한 설명을 첨부하였습니다.
'Flutter 앱 개발 기초' 카테고리의 다른 글
flutter 앱 기초 dart 문법 2 (1) | 2023.08.30 |
---|---|
flutter 앱 개발 기초 dart 문법 (2) | 2023.07.25 |
flutter 앱 개발 기초 로그인 페이지 만들기 (0) | 2023.07.22 |
flutter 앱 개발 기초 1회차 (0) | 2023.07.15 |