습관만들기 Pawbit TIL 6
상태가 바뀔 때 알림을 보내고 싶었는데
알림을 세 가지로 나눠 붙였다. 강아지 상태 알림, 목표 시간을 정한 습관의 시간 알림, 매일 앱에 들어오라는 기본 리마인더다. 설정에서 각각 켜고 끌 수 있다.
제일 고민한 건 강아지 상태 알림이다. 밥을 안 준 채 시간이 지나면 배고프다는 알림이 가야 한다. 그런데 로컬 알림(flutter_local_notifications)은 미리 예약해 두면 정해진 시각에 운영체제가 대신 띄워 주는 구조라, 알림이 뜨는 순간에는 앱 코드가 돌지 않는다. 그때 상태를 계산할 수 없고, 알림 내용도 예약할 때 정한 그대로다.
풀린 건 상태가 바뀌는 시점이 미리 정해져 있다는 데서였다. 밥은 마지막으로 준 뒤 1일째 배고픔, 2일째 많이 배고픔, 3일째 아픔으로 넘어간다. 마지막 케어 시각에 이 임계일을 더하면 단계가 바뀌는 순간이 나오니, 그 시각마다 알림을 미리 걸어 두면 된다. 케어를 하면 기준 시각이 바뀌니 그때마다 다시 계산해 건다.
같은 예약이라도 두 방식이 있다. 습관 시간 알림은 매일 같은 시각에 반복해서 걸고, 상태 알림은 계산한 그 시각에 한 번만 건다. 요일마다 다르게 울리는 습관 알림은 기기 시간대(타임존)를 정확히 잡아야 요일이 안 어긋나서, 일단 매일 울리게 두고 요일 필터는 뒤로 미뤘다.
- 판단: 그 순간에 계산할 수 없으면 미래를 미리 계산해 둘 수 있는지를 본다. 규칙이 시간으로 정해져 있으면 된다.
톤을 맞출 때 남겨 둘 색
홈·설정·내 습관 화면을 보드·상점과 같은 파스텔 톤으로 맞추면서 색을 두 부류로 나눴다. 카드 배경·테두리·보조 글자처럼 껍데기(chrome) 색은 공통 토큰으로 바꾸고, 케어 상태의 초록·노랑·빨강이나 경고색처럼 뜻이 있는 색(시맨틱 색)은 그대로 뒀다. 토큰은 앱 테마에 덧붙이는 확장(ThemeExtension)으로 얹어서, 어느 화면에서든 같은 값을 쓴다.
마을 맵과 갤러리는 아예 뺐다. 그림 배경 위에 반투명 덮개를 얹어 만든 화면이라, 파스텔 토큰을 입히니 오히려 어색했다.
- 판단: 톤 통일은 모든 색을 바꾸는 일이 아니다. 뜻을 전하는 색까지 바꾸면 신호가 흐려진다. 그림이 주인공인 화면은 톤 통일의 대상에서 뺀다.