2024. 12. 27. 10:00ㆍ같이 공부합시다 - Flutter/Flutter로 To-Do 앱 만들기
안녕하세요! 스테디빌더입니다! 😊
지난 글에서는 캘린더 모달에서 할 일 추가 시
모달이 중첩되는 문제에 대해 해결했었죠 !
2024.12.26 - [같이 공부합시다 - Flutter/Flutter로 To-Do 앱 만들기] - Flutter 캘린더 모달 중첩 문제 해결: 깔끔한 할 일 추가 기능 구현하기
Flutter 캘린더 모달 중첩 문제 해결: 깔끔한 할 일 추가 기능 구현하기
안녕하세요! 스테디빌더 입니다. 😊 지난 글에서는 캘린더에서 원하는 날짜를 누르고할 일을 추가할 때의 문제를 해결 했었죠. Flutter 캘린더 모달에서 선택한 날짜로 할 일 추가하기: 문제 해결
steadybuilder.tistory.com
캘린더 모달 안에서 할 일 목록 추가 기능을 넣었다가,
계속되는 문제점에 정신이 없네요. 😱😱😱
다 좋은 경험치가 될 거란 걸 믿어 봅시다.. (ㅎ)
혹시 Flutter로 캘린더와 To-Do 리스트 앱을 개발하면서,
할 일을 삭제한 후 검은 화면이 나타나거나
앱이 멈추는 문제를 경험해 보셨나요?
저는 이 문제를 겪었고, 해결 과정에서 많은 걸 배웠습니다.
오늘은 캘린더 모달에서 안전하게 할 일을 삭제하고,
UI를 유지하면서 오류를 방지하는 방법을 공유해 보려고 합니다 !

문제 개요
캘린더 모달에서 특정 날짜의 할 일을 여러 개 추가하고, 차례로 삭제한 후 모달을 닫으니 검은 화면이 나타나고 앱이 멈추는 현상이 발생했어요. 앱이 더 이상 동작하지 않아 강제 종료해야만 했습니다.
문제의 원인
찾아보니 이 문제의 주요 원인은 Navigator 스택 관리와 삭제 후 상태 갱신의 충돌인 것으로 예상됩니다.
- Navigator 상태 충돌:
- 모달 닫기(Navigator.pop)가 제대로 처리되지 않거나, 상태 변경 후 모달 스택이 비정상적으로 남아있어 화면이 멈췄습니다.
- 삭제 로직의 불완전성:
- _todoList, _calendarEvents, selectedDateTasks 간의 동기화가 제대로 이루어지지 않아, 삭제 후 잘못된 데이터가 화면에 표시되거나 잔여 상태가 꼬였습니다.
- UI 갱신 방식 문제:
- setState와 setModalState가 동시에 호출되면서 모달과 전체 상태 간의 충돌이 발생했습니다.
문제 해결 아이디어
- Navigator 스택 안전 관리:
- 모달 닫기 전에 Navigator.canPop(context)로 스택 상태를 확인하여 안전하게 닫습니다.
- 삭제 로직 개선:
- 삭제 대상 항목을 정확히 추적(indexWhere)하고, 모달 내부 상태(selectedDateTasks)와 전체 상태(_todoList, _calendarEvents)를 분리하여 동기화합니다.
- 모달 유지하며 삭제 처리:
- setModalState를 사용해 모달 내부 상태를 갱신하고, 모달이 유지된 상태에서 삭제가 안전하게 이루어지도록 구현합니다.
문제 해결 방안
수정된 삭제 버튼 로직
IconButton(
icon: const Icon(Icons.delete, color: Colors.redAccent),
onPressed: () {
final taskToDelete = task; // 삭제할 항목
final dateKey = _normalizeDate(_selectedDay ?? DateTime.now()); // 선택된 날짜 키
setState(() {
// _todoList에서 삭제
_todoList.removeWhere((item) =>
item['task'] == taskToDelete &&
_normalizeDate(DateTime.parse(item['date'])) == dateKey);
// _calendarEvents에서 해당 항목 삭제
_calendarEvents[dateKey]?.remove(taskToDelete);
// 해당 날짜의 이벤트 리스트가 비었다면, 날짜 키 제거
if (_calendarEvents[dateKey]?.isEmpty ?? true) {
_calendarEvents.remove(dateKey);
}
});
setModalState(() {
selectedDateTasks.remove(taskToDelete); // 선택된 날짜의 목록 갱신
});
},
),
주요 변경 사항
- _todoList에서 정확히 삭제:
- 삭제하려는 항목의 날짜(dateKey)와 작업(taskToDelete)을 기준으로 정확히 매칭되는 항목만 제거합니다.
- _calendarEvents 업데이트:
- 삭제된 작업만 제거하고, 해당 날짜의 이벤트 리스트가 비었으면 날짜 키도 삭제합니다.
- 모달 상태 갱신:
- setModalState로 selectedDateTasks를 동기화하여 삭제된 항목이 모달에서 즉시 사라지도록 처리합니다.
Navigator 문제 해결
Navigator 상태를 안전하게 관리하여 모달 닫기와 UI 갱신 간 충돌을 방지합니다.
수정된 닫기 버튼 로직
IconButton(
icon: const Icon(Icons.close),
onPressed: () {
// Navigator 상태 확인 후 모달 닫기
if (Navigator.canPop(context)) {
Navigator.of(context).pop();
}
},
),
테스트 결과
잘 동작하게 되었습니다 !
결론
이제 캘린더 모달에서 안전하게 할 일을 삭제할 수 있습니다.
삭제 작업 후에도 모달이 유지되고, 삭제된 항목이 정확히 반영되며, 앱이 멈추는 문제도 해결되었습니다. 😊
후우, 이런 문제들을 겪으면서 데이터간의 동기화가 얼마나 중요한지, 그리고 이런 계산들을 미리 설계해야 한다는 게 얼마나 중요한 건지 깨닫게 되었습니다.
이 글이 Flutter 앱 개발 과정에서 유용한 참고가 되었길 바래 봅니다.
오늘도 고생하셨습니다 !
끝 !
'같이 공부합시다 - Flutter > Flutter로 To-Do 앱 만들기' 카테고리의 다른 글
Flutter 캘린더 모달에서 "오늘" 버튼 만들기: 간단한 구현 가이드 (1) | 2024.12.29 |
---|---|
Flutter로 메인 화면에서 오늘 할 일 추가, 캘린더 모달에서는 선택된 날짜로 추가하기 (+메인/캘린더 할 일 추가 동작을 분리하는 방법) (5) | 2024.12.28 |
Flutter 캘린더 모달 중첩 문제 해결: 깔끔한 할 일 추가 기능 구현하기 (4) | 2024.12.26 |
Flutter 캘린더 모달에서 선택한 날짜로 할 일 추가하기: 문제 해결 가이드 (7) | 2024.12.24 |
Flutter 캘린더 모달에서 할 일을 추가하는 방법: 편리한 To-Do 관리 기능 구현하기 (5) | 2024.12.24 |