to 주환 - 달력 model 설명

박민준·2022년 1월 26일
0
post-thumbnail

너가 건드려야 할 곳은 이 파일들이야

기본적 위계 트리는
1) mission_page에서 해당 페이지 전체를 관리하고
그 페이지 관리에 도움을 주는 mission_controller가 있음
2) 그리고 mission_page 내부에 Calendar 객체는 statless로 calendar.dart에서 따로 관리
3) calendar의 데이터 관리를 책임지는 calendar_controller가 따로 있고, 데이터는 구조와 실제 데이터 map형태로 만들어놓은거 2개는 calendar_model에 담겨있음.
cf) calendar_model은 calendar.dart와 직접 연결되진 않고 무조건 calendar_controller를 통해서만 연결되도록 해 놓음.

mission_page

ListView 내부에 일단 아래 _buildMissionContainer 3개가 있음. 이것은 이거 3개임

코드는 아래와 같고

내부에 이 부분만 따로 또 메소드로 구현해놨으

그러고 아래에 드디어
Calendar() 객체가 나옴

calendar.dart

구조는
Column -> [Getbuilder(TableCalendar()), SizedBox(), Getbuilder(Container())]
이렇게 되어 있음. Obx 대신 GetBuilder를 해놓은건 obx가 인식이 안됨.

calenar_model.dart

이제 이부분이 제일 중요할 듯

1) 일단 Event 객체를 정의했음

2) 위 객체를 가져다가 Map 정의 (실제 데이터 부분 - 이걸 이제 DB에서 불러오는 거로 고쳐야겠지)

3) LinkedHashMap- 직접 신경쓸 필요 없음. 위의 map에 기능 추가해준 거임 그냥.

// 주환, 직접 신경쓰진 않아도 됨. 이부분은 그냥 공식문서 추천 방식이라서 위의 map을 LinkedHashMap으로 진화시킨겨
final events = LinkedHashMap(
  equals: isSameDay,
)..addAll(eventSource);

이제 3번의 events변수로 calendar_controller에서 무언가 데이터 처리를 한다고 보면됨.
events변수에 집중하자!

calenar_controller.dart

일단 getX의 정신에 따라... view를 직접 보여주는 코드 부분에는 내부 로직이 최대한 노출되지 않도록 웬만한 메소드, 데이터 처리 로직은 다 controller안에 우겨넣었다고 보면 됨.

import 'calendar_model.dart';

일단 이렇게 위에서 정의한 model을 가져와주고

직접적으로 model의 events변수를 다룰 수 있게 됐다.

이 메소드는 DateTime 값을 받거나 받지 않는다. optional parameter사용. 안 받을 때는 selectedDay를 그냥 활용.
(selectedDay는 옵저버블 변수로, 내가 선택한 날짜를 말함 - 너가 직접 신경 쓸 필요는 없음)

어찌 됐든 핵심은 특정 날짜의 event 리스트를 불러온다. null이면 빈 리스트 리턴하고
이 메소드를 활용해서 직접적으로 events변수를 건드리는 것!

makeTable 메소드

이거는 불러온 이벤트, (이벤트는 리스트 형태로 불러와지겠지? List<Event> 형태) 를 각 인덱스를 key로 하는 Map으로 만들어줘. event.asMap()으로
그러고 아래처럼 사용해.

이렇게 하는 이유는 다음과 같음.
1) list를 그냥 인덱싱하면 없는 인덱스로 불러왔을 때 error가 뜸. 하지만 map으로 변경한 후 인덱스를 키처럼 사용하면 null을 대신 리턴함. 그러니까 null이 나왔을 때에 대해 예외처리를 해줄 수 있음.
2) 그럼 더 근본적으로 왜 null을 처리해줘야 하나. 미션이 3개일 수도 있고, 4개일 수도 있으니깐, 애초에 List<Event> 길이가 4일 수도 3일수도 있다는 거잖아. 그러니까 어떤 경우든 깨지지 않고 위젯으로 표현해주기 위해 하는 방법
3) 그래서 추가적으로 Builder를 사용해서 null에 대한 조건 처리를 추가해줬음. null일 경우 빈 Text 위젯을 리턴하도록!

profile
코린이

0개의 댓글