# 강의 제목 : 누적다운로드 120만+ 1인 개발자와 함께하는 앱 개발 입문 Online
# 강의 목표 : 기초부터 운영까지 앱 개발의 전체 프로세스를 이해한다.
내 이름으로 된 앱을 최대 10개까지 만들어 출시할 수 있다.
앱 개발자로 성장할 수 있는 초석을 다진다.
반응 얻는 앱의 특징과 노하우를 알아간다.
향후 강의 없이도 나만의 앱을 개발할수 있는 실력을 가진다.
# 강의 요약 : 프로그램 설치부터 기본 문법, 광고 다는 법, 클론코딩을 진행하며 필수 지식을 학습한다.
총 10개의 다른 주제로 실제 사용화 가능한 수준의 앱을 만들어본다.
나의 앱을 세상에 선보이기 위한 개발자 등록 및 배포를 진행한다.
강사님의 리뷰/클레임 대응사례 등 앱 성공 포인트를 참고해 1인 개발자로서의 입지를 다진다.
# 강의 목차 : Flutter 실전 앱 제작
- 앱 기능 및 디자인 설계 및 초기 구조 만들기 (눈바디앱)
- 식단 기록 페이지
- 눈바디 운동 기록 페이지
- 달력 기록 페이지 - 28일차
- 달력 기록 페이지 2 - 28일차
- 통계 갤러리 알림 설정하기
- 다크모드 지원하기
# 강의 화면 :
# 강의 내용 : 달력 기록 페이지 1, 2
1. 달력 기록 페이지 작성하기
# main.dart
void getAllHistories() async {
todayFood = await dbHelper.queryAllFood();
todayWorkout = await dbHelper.queryAllWorkout();
todayEyeBody = await dbHelper.queryAllEyeBody();
setState(() {
});
}
@override
void initState() {
getHistories();
initNotification();
super.initState();
}
void setScheduling() async{
var android = AndroidNotificationDetails(
"fastcampus", "eyebody", "eyebody notification",
importance: Importance.max,
priority: Priority.max);
var ios = IOSNotificationDetails();
NotificationDetails detail = NotificationDetails(
iOS: ios,
android: android
);
flutterLocalNotificationsPlugin.zonedSchedule(
0, "오늘 다이어트를 기록해주세요!",
"앱에서 기록을 알려주세요!!",
tz.TZDateTime.from(DateTime.now().add(Duration(seconds: 10)), tz.local),
detail,
androidAllowWhileIdle: true,
uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime,
payload: "eyebody",
matchDateTimeComponents: DateTimeComponents.time
);
}
# main.dart
Widget getGalleryPage(){
return Container(
child: GridView.count(
crossAxisCount: 3,
childAspectRatio: 1,
children: List.generate(
todayEyeBody.length, (idx){
return EyeBodyCard(eyeBody: todayEyeBody[idx]);
}
),
),
);
}
}
class FoodCard extends StatelessWidget {
final Food food;
FoodCard({Key key, this.food}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.all(8),
child: ClipRRect(
child: Stack(
children: [
Positioned.fill(
child: AssetThumb(asset: Asset(food.image, "food.png", 0, 0), width: 300, height: 300),
),
Positioned.fill(
child: Container(color: Colors.black38),
),
Container(
alignment: Alignment.center,
child: Text("${["아침", "점심", "저녁", "간식"][food.type]}", style: TextStyle(color: Colors.white),),
)
],
),
borderRadius: BorderRadius.circular(8),
),
);
}
}
class WorkoutCard extends StatelessWidget {
final Workout workout;
WorkoutCard({Key key, this.workout}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.all(8),
child: ClipRRect(
child: Stack(
children: [
Positioned.fill(
child: AssetThumb(asset: Asset(workout.image, "food.png", 0, 0), width: 300, height: 300),
),
Positioned.fill(
child: Container(color: Colors.black38),
),
Container(
alignment: Alignment.center,
child: Text("${workout.name}", style: TextStyle(color: Colors.white),),
)
],
),
borderRadius: BorderRadius.circular(8),
),
);
}
}
class EyeBodyCard extends StatelessWidget {
final EyeBody eyeBody;
EyeBodyCard({Key key, this.eyeBody}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.all(8),
child: ClipRRect(
child: Stack(
children: [
Positioned.fill(
child: AssetThumb(asset: Asset(eyeBody.image, "food.png", 0, 0), width: 300, height: 300),
),
Positioned.fill(
child: Container(color: Colors.black38),
),
Container(
alignment: Alignment.center,
child: Text("${eyeBody.weight}kg", style: TextStyle(color: Colors.white),),
)
],
),
borderRadius: BorderRadius.circular(8),
),
);
}
}
2. getHistory 페이지 구현
Widget getHistoryPage(){
return Container(
child: ListView(
children: [
TableCalendar(
initialSelectedDay: time,
calendarController: controller,
onDaySelected: (date, events, holidays){
time = date;
getHistories();
},
),
getMainPage()
],
),
);
}
Widget getChartPage(){
return Container(
child: Column(children: [
getMainPage(),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text("총 기록 식단 수\n${todayFood.length}"),
Text("총 기록 운동 수\n${todayWorkout.length}"),
Text("총 기록 눈바디 수\n${todayEyeBody.length}"),
],
)
]),
);
}
# 교육 소감
# 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'코딩 알로하 :: two > 하이브리드앱' 카테고리의 다른 글
패스트캠퍼스 챌린지 30일차 (0) | 2021.11.30 |
---|---|
패스트캠퍼스 챌린지 29일차 (0) | 2021.11.29 |
패스트캠퍼스 챌린지 27일차 (0) | 2021.11.27 |
패스트캠퍼스 챌린지 26일차 (0) | 2021.11.26 |
패스트캠퍼스 챌린지 25일차 (0) | 2021.11.25 |
댓글