lib
아래에 폴더 3개 만들기 (model, screen, widget)
=> 각 역할을 하는 코드들끼리 같은 폴더 안에 놔둬서 관리하기 쉽게 하기 위함
model : 데이터베이스 모델 관련된 파일들
screen : 각 화면별 파일
widget : 여러번 반복되거나 자주 사용될 widget에 대한 코드
MyApp
을 Stateless Widget
으로 하는 것이 아니라, Stateful Widget
으로 하여서 아래의 MyHomePage
를 사용하지 않는 방식 사용
=> 아래 코드 다 삭제
main.dart
import 'package:flutter/material.dart';
import 'package:flutter_netflix_clone_app/widget/bottom_bar.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
_MyAppState createState() => _MyAppState(); // MyApp에 대한 상태 관리
}
class _MyAppState extends State<MyApp> { // MyApp의 상태를 관리하는 _MyAppState를 클래스로 만듦
late TabController controller;
Widget build(BuildContext context) { // 오버라이드를 통해서 Widget build() 함수 만듦
// 내비게이션 탭 구조를 작성함에 앞서서 기본적인 MaterialApp 설정
return MaterialApp(
title: 'YeahFlix',
theme: ThemeData(
brightness: Brightness.dark,
primaryColor: Colors.black,
//accentColor: Colors.white
),
home: DefaultTabController(
length: 4, // 하단 바 메뉴 수
child: Scaffold(
body: TabBarView(
physics: const NeverScrollableScrollPhysics(), // NeverScrollableScrollPhysics : 사용자가 직접 손가락 모션을 통해서 스크롤하는 기능을 막는 기능
children: <Widget>[
Container(
child: const Center(
child: Text('home'),
),
),
Container(
child: const Center(
child: Text('search'),
),
),
Container(
child: const Center(
child: Text('save'),
),
),
Container(
child: const Center(
child: Text('more'),
),
),
],
),
bottomNavigationBar: Bottom(),
),
),
);
}
}
bottom_bar.dart
- widgetimport 'package:flutter/material.dart';
class Bottom extends StatelessWidget { // 상태 관리가 필요없는 위젯이므로 StatelessWidget으로 만듦
Widget build(BuildContext context) {
return Container(
color: Colors.black,
child: Container(
height: 50,
child: const TabBar(
labelColor: Colors.white,
unselectedLabelColor: Colors.white60,
indicatorColor: Colors.transparent,
tabs: <Widget>[
Tab(
icon: Icon(
Icons.home,
size: 18,
),
child: Text(
'홈',
style: TextStyle(fontSize: 9),
),
),
Tab(
icon: Icon(
Icons.search,
size: 18,
),
child: Text(
'검색',
style: TextStyle(fontSize: 9),
),
),
Tab(
icon: Icon(
Icons.save_alt,
size: 18,
),
child: Text(
'저장한 콘텐츠',
style: TextStyle(fontSize: 9),
),
),
Tab(
icon: Icon(
Icons.list,
size: 18,
),
child: Text(
'더보기',
style: TextStyle(fontSize: 9),
),
),
],
),
),
);
}
}
- 넷플릭스의 4가지 탭 중 첫 번째인 홈 탭 구성
- 상단바, 전체화면 영화 포스터, 영화 정보, 찜하기 기능, 영화 세부 정보 화면, 미리보기 위젯(원형, 사각), 재생하기는 생략
images
폴더 만들고 안에 로고 이미지 넣기pubspec.yaml
assets:
- images/bbongflix_logo.png
👉 assets 주석 없애고 images에 넣은 로고 이미지 파일 이름 적기
home_screen.dart
- screenimport 'package:flutter/material.dart';
class HomeScreen extends StatefulWidget { // 영화 데이터를 백엔드에서 가져와야 되기 때문에 StatefulWidget으로 만듦
_HomeScreenState createState() => _HomeScreenState(); // HomeScreen에 대한 상태 관리
}
class _HomeScreenState extends State<HomeScreen> {
void initState() {
super.initState();
}
Widget build(BuildContext context) {
return TopBar();
// return Container(
// child: const Center(
// child: Text('real home'),
// ),
// );
}
}
class TopBar extends StatelessWidget {
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.fromLTRB(20, 7, 20, 7),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, // 간격 수정
children: <Widget>[
Image.asset(
'images/bbongflix_logo.png',
fit: BoxFit.contain,
height: 25,
),
Container(
padding: const EdgeInsets.only(right: 1),
child: const Text(
'TV 프로그램',
style: TextStyle(fontSize: 14),
),
),
Container(
padding: const EdgeInsets.only(right: 1),
child: const Text(
'영화',
style: TextStyle(fontSize: 14),
),
),
Container(
padding: const EdgeInsets.only(right: 1),
child: const Text(
'내가 찜한 콘텐츠',
style: TextStyle(fontSize: 14),
),
),
],
),
);
}
}
main.dart
일부 home: DefaultTabController(
length: 4, // 하단 바 메뉴 수
child: Scaffold(
body: TabBarView(
physics: const NeverScrollableScrollPhysics(),
children: <Widget>[
HomeScreen(), // 이 부분 수정됨!
Container(
child: const Center(
child: Text('search'),
),
),
넷플릭스 프로젝트에 들어갈 영화 모델 만들기
images
폴더 안에 포스터 사진 넣기pubspec.yaml
# pubspec.yaml
# The following section is specific to Flutter.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
assets:
- images/bbongflix_logo.png
- images/test_movie_1.png
model_movie.dart
- modelclass Movie {
final String title;
final String keyword;
final String poster;
final bool like; // 해당 영화를 찜하기 하였는지 확인하기 위한 like 변수
Movie.fromMap(Map<String, dynamic> map) // 메소드
: title = map['title'],
keyword = map['keyword'],
poster = map['poster'],
like = map['like'];
String toString() => "Movie<$title:$keyword>"; // 인스턴스를 출력할 때 용이하기 위해 toString() 메소드를 override
}
home_screen.dart
일부 - screenclass _HomeScreenState extends State<HomeScreen> {
// 더미 데이터
List<Movie> movies = [
Movie.fromMap({
'title': '사랑의 불시착',
'keyword': '사랑/로맨스/판타지',
'poster': 'test_movie_1.png',
'like': false
})
];
void initState() {
super.initState();
}
set 형태로 관리해도 되지만 굳이 Movie 모델로 선언하여 더미 데이터로 만드는 이유
👉 추후 파이어베이스와의 연동에서 실제로 가져오는 데이터를 그대로 처리하기 위함
홈 화면에 들어갈 위젯 만들기
1. 상단바에 배경으로 있는 슬라이드 형태 위젯
CarouselImage
📌 갑자기 너무 어려워져서 아무래도 다른 기초 강의를 먼저 듣고 해야겠음.. 받아들이려고 해도 에러 코드 나오면 뭐가 뭔지 모르겠으니까 문제임 ㅠ 공부하고 오겠습니다.. 😥