# 강의 제목 : 누적다운로드 120만+ 1인 개발자와 함께하는 앱 개발 입문 Online
# 강의 목표 : 기초부터 운영까지 앱 개발의 전체 프로세스를 이해한다.
내 이름으로 된 앱을 최대 10개까지 만들어 출시할 수 있다.
앱 개발자로 성장할 수 있는 초석을 다진다.
반응 얻는 앱의 특징과 노하우를 알아간다.
향후 강의 없이도 나만의 앱을 개발할수 있는 실력을 가진다.
# 강의 요약 : 프로그램 설치부터 기본 문법, 광고 다는 법, 클론코딩을 진행하며 필수 지식을 학습한다.
총 10개의 다른 주제로 실제 사용화 가능한 수준의 앱을 만들어본다.
나의 앱을 세상에 선보이기 위한 개발자 등록 및 배포를 진행한다.
강사님의 리뷰/클레임 대응사례 등 앱 성공 포인트를 참고해 1인 개발자로서의 입지를 다진다.
# 강의 목차 : Flutter 실전 앱 제작
- 앱 기능 및 디자인 설계 및 초기 구조 만들기 (눈바디앱) - 26일차
- 식단 기록 페이지
- 눈바디 운동 기록 페이지
- 달력 기록 페이지
- 달력 기록 페이지 2
- 통계 갤러리 알림 설정하기
- 다크모드 지원하기
# 강의 화면 :
# 강의 내용 : 앱 기능 및 디자인 설계 및 초기 구조 만들기 (눈바디앱)
1. 앱 디자인
- 식단, 눈바디를 기록할 수 있음
- 식단 사진, 시간, 종류 등 정보를 입력할 수 있음
- 운동 정보를 기록할 수 있음
- 기록페이지에서 이전 기록을 확인할 수 있음
2. 데이터 설계
식단 / 운동 / 눈바디
- 날짜 - 날짜 - 날짜
- 식단 타입 - 이름 - 사진
- 메모 - 메모 - 메모
- 사진 - 시간
3. 화면 설계
- 메인 화면
. 운동, 식단, 눈바디 확인 가능
- 운동/식단/눈바디 추가 페이지
. 각 정보를 추가할 수 있음
- 기록 페이지
. 이전 날짜 기록을 확인 할 수 있음
- 통계 페이지
. 이전 기록을 통계로 확인할 수 있음
4. 앱 디자인
5. 데이터 설계
# data.dart
class Food {
int id;
int date;
int type;
int kcal;
String image;
String memo;
Food({this.id, this.date, this.type,
this.kcal, this.image, this.memo});
factory Food.fromDB(Map<String, dynamic> data){
return Food(
id: data["id"],
date: data["date"],
type: data["type"],
kcal: data["kcal"],
image: data["image"],
memo: data["memo"],
);
}
Map<String, dynamic> toMap() {
return {
"id": this.id,
"date": this.date,
"type": this.type,
"kcal": this.kcal,
"image": this.image,
"memo": this.memo
};
}
}
class Workout {
int id;
int date;
int time;
String image;
String name;
String memo;
Workout({this.id, this.date, this.time, this.image, this.name, this.memo});
factory Workout.fromDB(Map<String, dynamic> data){
return Workout(
id: data["id"],
date: data["date"],
time: data["time"],
name: data["name"],
image: data["image"],
memo: data["memo"],
);
}
Map<String, dynamic> toMap() {
return {
"id": this.id,
"date": this.date,
"time": this.time,
"name": this.name,
"image": this.image,
"memo": this.memo
};
}
}
class EyeBody {
int id;
int date;
int weight;
String image;
EyeBody({this.id, this.date, this.weight, this.image});
factory EyeBody.fromDB(Map<String, dynamic> data){
return EyeBody(
id: data["id"],
date: data["date"],
weight: data["weight"],
image: data["image"]
);
}
Map<String, dynamic> toMap(){
return {
"id": this.id,
"date": this.date,
"weight": this.weight,
"image": this.image
};
}
}
6. 데이터 사용하기 위한 라이브러리 추가
# pubspec.yaml
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.0
sqflite: ^1.3.2+4
# database.dart
import 'package:eyebody/data/data.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class DatabaseHelper {
static final _databaseName = "eyebody.db";
static final int _databaseVersion = 1;
static final foodTable = "food";
static final workoutTable = "workout";
static final eyeBodyTable = "eyeBody";
DatabaseHelper._privateConstructor();
static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
static Database _database;
Future<Database> get database async {
if(_database != null) return _database;
_database = await _initDatabase();
return _database;
}
_initDatabase() async {
var databasePath = await getDatabasesPath();
String path = join(databasePath, _databaseName);
return await openDatabase(path, version: _databaseVersion,
onCreate: _onCreate, onUpgrade: _onUpgrade);
}
Future _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE IF NOT EXISTS $foodTable (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date INTEGER DEFAULT 0,
type INTEGER DEFAULT 0,
kcal INTEGER DEFAULT 0,
image String,
memo String
)
''');
await db.execute('''
CREATE TABLE IF NOT EXISTS $workoutTable (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date INTEGER DEFAULT 0,
time INTEGER DEFAULT 0,
name String,
image String,
memo String
)
''');
await db.execute('''
CREATE TABLE IF NOT EXISTS $eyeBodyTable(
id INTEGER PRIMARY KEY AUTOINCREMENT,
date INTEGER DEFAULT 0,
weight INTEGER DEFAULT 0,
image String
)
''');
}
Future _onUpgrade(Database db, int oldVersion, int newVersion) async {}
Future<int> insertFood(Food food) async {
Database db = await instance.database;
if(food.id == null){
final map = food.toMap();
return await db.insert(foodTable, map);
}else{
final map = food.toMap();
return await db.update(foodTable, map, where: "id = ? ", whereArgs: [food.id]);
}
}
Future<List<Food>> queryFoodByDate(int date) async {
Database db = await instance.database;
List<Food> foods = [];
final query = await db.query(foodTable, where: "date = ?", whereArgs: [date]);
for(final r in query){
foods.add(Food.fromDB(r));
}
return foods;
}
Future<List<Food>> queryAllFood() async {
Database db = await instance.database;
List<Food> foods = [];
final query = await db.query(foodTable);
for(final r in query){
foods.add(Food.fromDB(r));
}
return foods;
}
Future<int> insertWorkout(Workout workout) async {
Database db = await instance.database;
if(workout.id == null){
final map = workout.toMap();
return await db.insert(workoutTable, map);
}else{
final map = workout.toMap();
return await db.update(workoutTable, map, where: "id = ? ", whereArgs: [workout.id]);
}
}
Future<List<Workout>> queryWorkoutByDate(int date) async {
Database db = await instance.database;
List<Workout> workouts = [];
final query = await db.query(workoutTable, where: "date = ?", whereArgs: [date]);
for(final r in query){
workouts.add(Workout.fromDB(r));
}
return workouts;
}
Future<List<Workout>> queryAllWorkout() async {
Database db = await instance.database;
List<Workout> workouts = [];
final query = await db.query(workoutTable);
for(final r in query){
workouts.add(Workout.fromDB(r));
}
return workouts;
}
Future<int> insertEyeBody(EyeBody eyeBody) async {
Database db = await instance.database;
if(eyeBody.id == null){
final map = eyeBody.toMap();
return await db.insert(eyeBodyTable, map);
}else{
final map = eyeBody.toMap();
return await db.update(eyeBodyTable, map, where: "id = ? ", whereArgs: [eyeBody.id]);
}
}
Future<List<EyeBody>> queryEyeBodyByDate(int date) async {
Database db = await instance.database;
List<EyeBody> bodies = [];
final query = await db.query(eyeBodyTable, where: "date = ?", whereArgs: [date]);
for(final r in query){
bodies.add(EyeBody.fromDB(r));
}
return bodies;
}
Future<List<EyeBody>> queryAllEyeBody() async {
Database db = await instance.database;
List<EyeBody> bodies = [];
final query = await db.query(eyeBodyTable);
for(final r in query){
bodies.add(EyeBody.fromDB(r));
}
return bodies;
}
}
# 교육 소감
# 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'코딩 알로하 :: two > 하이브리드앱' 카테고리의 다른 글
패스트캠퍼스 챌린지 28일차 (0) | 2021.11.28 |
---|---|
패스트캠퍼스 챌린지 27일차 (0) | 2021.11.27 |
패스트캠퍼스 챌린지 25일차 (0) | 2021.11.25 |
패스트캠퍼스 챌린지 24일차 (0) | 2021.11.24 |
패스트캠퍼스 챌린지 23일차 (0) | 2021.11.23 |
댓글