Todo App 구현을 끝냈다.
기본 과제부터 도전과제까지 마무리하고 나니 뿌듯함이 느껴진다.
그래도 할 건 해야지.
개발 중 여러 Trouble을 겼었다..

가장 크게 당황했던 건, Layout 구조에 대해 익숙해질 무렵 날 찾아온 이 녀석들이었다.
BottomSheet를 구현하며, Column의 자식으로 Column을 주게 되니 무한 충돌이 이러나게 되었다.
지금 돌이켜보니 Column은 MainAxisSize 기본값이 무한이라 끝없이 확장될텐데 왜 이제 이해했는지 모르겠다..
덕분에 다방면으로 많이 고민해봤고, 앞으로는 같은 실수는 하지 않아야겠다는 생각이 정말 많이 든다.
가장 많이 써봤던 Widget은 당연히 Container, Row, Column인데 세 Widget 모두 직접적인 크기 지정이 없을 경우 무한정 확장될 수 있음에 주의해야겠다.

이번 TodoApp을 개발하며 처음으로 Provider 상태 관리 라이브러리를 사용해봤다.
처음에는 Provider 설정부터 사용법까지 미숙했지만, 이제 어느정도 이해는 된 듯 하다.
Provider 객체를 직접 사용하면 listen 속성이 true로 설정된다.
이는 context.watch와 같은 역할을 하게 되는데, 쓸데없는 rebuild로 이어진다.
watch/read/select의 역할을 확실히 이해하고 넘어가려고 한다.
context.watch : Provider가 변화를 감지하면, ui에 다시 그린다.
context.read : Provider가 변화를 감지해도, ui의 변화는 없다
context.select : context.watch와 같은 역할을 하지만, 메모리 효율성을 위해 특정 멤버의 변경사항만을 적용한다.
다음 팀 프로젝트에서는 select를 통해 쓸데없는 부분의 rebuild를 줄여봐야겠다.
TodoEntity의 final로 지정된 isDone과 isFavorite를 변경하려니 컴파일 에러가 발생했다.
이미 상수로 정의된 객체의 필드에 접근하려니 이는 당연한 결과다.
그래서 Provider 내의 List를 깊은 복사를 통해 접근하려니, 이는 메모리 낭비가 너무 심해질 것 같았다.
그래서 찾아낸 결과가 List의 요소, 즉 TodoEntity 자체를 바꾸는 것이었다.
TodoEntity class에 copyWith 메서드를 통해 isDone과 isFavorite를 원하는 대로 설정해 지정할 수 있게 해주었다.
Data class 내에서도 이번 copyWith나 fromJson, toJson 같이 여러 함수를 잘 정의해서 사용해봐야겠다.