주경야경
낮에도 일하고 밤에도 일하는 삶을 살고 있습니다.
회사는 돈 30만원에 잘 만들어졌지만 먹고 살만큼 돈은 안들어오니
낮에는 이일 저일 열심히 하고 있습니다.
원래 목표는 12월달에 간단한 계산기만 구현해서 출시를 시작할 예정이었지만..
가계부 기능은 있어야 하지 않나 라는 마음에 출시를 늦췄습니다.
UI 구성
무에서 유를 창조하는 성격은 아니다 보니
"편한 가계부" 라는 앱을 참고해서 제작 하고 있습니다.
편한 가계부는 벌써 다운로드 수가 2000만이네요.
처음에는 피그마로 다 그려서 했는데 지금은 그냥 "편한가계부" 키고 전체적인 틀을 따오고
세부적인 Ux 부분을 손보고 있습니다.
대박 앱을 따라가야 조금이라도 줍줍을 할 수 있지 않을까 하는 마음입니다..ㅋㅋ
상태관리 + 디자인패턴
Getx는 정말 편리합니다. 1인 개발자라면 이건 선택사항이 아니라 필수사항이라고 생각되네요.
개인적으로 다음으로 배우고 싶은 상태관리는 Bloc입니다. Rivepod도 뜨고는 있지만 해외 개발자분들은 Bloc가 Flutter 상태관리 끝판왕이라고 하네요..ㅎㅎㅎ
디자인 패턴은 MVC를 적용하고 있습니다. 요즘은 MVVM을 더 선호한다고 하네요. 얼마전에 같이 일했던 팀장님이랑 만나서 개발이야기를 했는데 MVVM으로 하라고 조언을 받았습니다. 하지만...뭐 일단 MVC로 시작을 해서... 나중에 시간이 되면........
DB
현재 로컬 DB. Sqlflite를 사용하고 있습니다. 간단한 앱이라 hive를 사용해도 되지만 후에 supabase 를 사용할 예정이라 sql 기반으로 Db를 선택했습니다. 다른 로컬 Db보다 코드양은 많네요...
전체적인 흐름
가계부에 입력 되는 데이터를 일별 데이터로만 저장합니다.
Map함수를 써서 {2024년 1월 1일 : 데이터 }
그리고 저장되어 있는 일별 데이터를 현재 필터 리스트 함수를 통해서 필요한 데이터를 뽑아내고 있습니다.
여기서 실수를 한게 초반에 사용했던 날짜 함수의 포맷팅을 "yyyy년 MM월"로 했어야 했는데.. "yyyy-MM"으로 해버려서..
나중에 필터 함수 조건을 수정해야 할 것 같습니다.
Future<Map<String, Map<String, List<ExpenseRecordItem>>>>
groupExpensesByMonthAndDate(List<ExpenseRecordItem> expenses) async {
final Map<String, Map<String, List<ExpenseRecordItem>>>
groupedExpensesByMonth = {};
for (final expense in expenses) {
final month =
DateFormat('yyyy-MM').format(DateTime.parse(expense.createdTime));
final date =
DateFormat('yyyy-MM-dd').format(DateTime.parse(expense.createdTime));
if (!groupedExpensesByMonth.containsKey(month)) {
groupedExpensesByMonth[month] = {};
}
if (groupedExpensesByMonth[month]!.containsKey(date)) {
groupedExpensesByMonth[month]![date]!.add(expense);
} else {
groupedExpensesByMonth[month]![date] = [expense];
}
}
// 각 월에 대해 내부의 날짜를 내림차순으로 정렬
groupedExpensesByMonth.forEach((month, expensesByDate) {
final sortedDates = expensesByDate.keys.toList()
..sort((a, b) => DateTime.parse(b).compareTo(DateTime.parse(a)));
groupedExpensesByMonth[month] = LinkedHashMap.fromIterable(
sortedDates,
key: (key) => key,
value: (key) => expensesByDate[key]!,
);
});
return groupedExpensesByMonth;
}
//내가 택한 월만 보여주는 코드
void filterExpensesByMonth(String selectedMonth) {
filteredExpenses.clear(); // 기존 데이터를 비워줍니다.
filteredExpenses.assignAll(expenseRecords.where((expense) {
final month =
DateFormat('yyyy-MM').format(DateTime.parse(expense.createdTime));
return month == selectedMonth;
}).toList());
update();
}
// 이전달로 이동하는 함수
void moveToPreviousMonth() {
update();
final currentMonth = DateTime.parse(selectedMonth.value + '-01');
final previousMonth = DateTime(currentMonth.year, currentMonth.month - 1);
if (previousMonth.isBefore(DateTime(2000))) {
return; // 2000년 이전으로 이동하지 못하게 처리
}
selectedMonth.value = DateFormat('yyyy-MM').format(previousMonth);
filterExpensesByMonth(selectedMonth.value);
}
void moveToNextMonth() {
update();
final currentMonth = DateTime.parse(selectedMonth.value + '-01');
final nextMonth = DateTime(currentMonth.year, currentMonth.month + 1);
if (nextMonth.isAfter(DateTime(2100))) {
return; // 2100년 이후로 이동하지 못하게 처리
}
selectedMonth.value = DateFormat('yyyy-MM').format(nextMonth);
filterExpensesByMonth(selectedMonth.value);
}
결산 부분만 최대한 빨리 진행을 해서 앱 배포를 할 예정입니다..!
'1인 어플 개발 > 개발 썰' 카테고리의 다른 글
구글 리얼머니 게임 규제 완화 방향성 (0) | 2024.01.18 |
---|---|
오..미국 대법원에서 앱스토어 수수료 항소 까임 (0) | 2024.01.17 |
Flutter - 음식점 사장님들을 위한 장부 테스트 코드 (1) | 2023.11.21 |
GPT - GPTs (0) | 2023.11.10 |
비전공자 스타트업 출근기 15 - 퇴사 (1) | 2023.10.28 |