습관만들기 Pawbit TIL 14
흰색을 고르면 타일이 안 보였다
습관 타일은 배경을 습관 색으로 칠했다. 그런데 흰색을 고르면 배경이 흰색이라 그 위에 얹는 것들이 묻혔다. 그래서 역할을 뒤집자고 했다. 배경은 항상 흰색, 고른 색은 2.5px 테두리로 둔다.
뒤집고 나니 분기 하나가 통째로 필요 없어졌다. 앞선 TIL 11에서 배경이 밝으면 완료 도장을 더 진하게 찍으려고 배경 밝기(computeLuminance)를 재서 나눴는데, 배경이 늘 흰색이니 도장은 진한 갈색 하나로 고정하면 된다.
- 판단: 예외(흰색)를 조건문으로 막기보다, 예외가 생기지 않게 구조를 바꿀 수 있는지 먼저 본다. 조건을 없앨 수 있으면 없애는 게 낫다.
흰 발바닥은 흰 배경에 묻혔다
주간 보기의 완료 발바닥은 습관 색으로 칠한다. 흰색 습관이면 흰 발바닥이 흰 배경에 묻혀 안 보였다. 발바닥에 테두리를 넣을 수 있는지 물었다.
처음에는 발바닥 뒤에 조금 더 큰 검정 발바닥을 깔아 외곽선처럼 보이게 했는데, 투박해서 별로였다. 다시 고른 방식은 선택한 색보다 진한 원 위에 선택한 색 발바닥을 올리는 것이다.
“선택한 색보다 진한 색”은 Color.lerp로 만든다. 두 색을 정한 비율만큼 섞어 주는 함수라, 검정과 35% 섞으면 같은 계열의 더 진한 색이 나온다. 흰색이면 회색 원에 흰 발바닥, 파스텔이면 진한 같은 계열 원에 밝은 발바닥이 되어 어떤 색이든 명도 차로 보인다.
- 판단: 색끼리 대비를 만들 때는 새 색을 고르기보다 그 색을 기준으로 진하게(또는 옅게) 만든다. 그래야 어떤 색을 골라도 어울린다.
조각도 없는데 강아지가 아프면
강아지가 아프면 꿈 조각 5개를 내고 요정에게 치료받는다. 그런데 조각이 모자라면 할 수 있는 게 없다. 광고를 한 번 보면 낫게 해 주는 건 어떤지 물었고, 조각이 모자랄 때만 “광고 보고 치료”를 보여 주기로 했다. 조각이 충분하면 원래대로 조각으로 치료한다.
상점의 보상형 광고(rewarded ad, 끝까지 보면 보상을 주는 광고)를 그대로 가져왔지만 두 가지가 달랐다.
-
앞선 TIL 7에서 상점 광고에 건 하루 3회 제한을 걸지 않았다. 상점 광고는 재화를 주니 반복해 찍어 낼 수 있어서 제한했지만, 치료는 막힌 걸 풀어 주는 구제라서 반복할 이유가 없다.
-
광고를 중간에 닫는 경우를 챙겼다. 끝까지 안 보면 보상 확정 신호(
onUserEarnedReward, 앞선 TIL 7에서 광고 횟수를 올리던 자리)가 안 온다. 그대로 두면 “치료 중” 표시가 화면에 걸려 남는다. 광고가 닫혔다는 신호(onAdDismissedFullScreenContent)에서 화면 상태를 되돌린다. -
판단: 보상과 화면 정리는 서로 다른 신호에 건다. 보상은 확정됐을 때만, 정리는 어떻게 끝나든 닫혔을 때 한다.
설치한 앱에 수정이 안 보였다
실기기에 설치해 달라고 했는데, 설치된 앱에 방금 고친 게 안 보였다. 게다가 처음 설치하던 중에 기존 앱이 먼저 지워지면서 기기에 쌓아 둔 테스트 데이터도 날아갔다.
개발용(debug) 빌드는 flutter run으로 컴퓨터에 붙여서 실행하는 걸 전제로 만든다. 그 앱 파일(APK)만 따로 설치하면 최신 코드가 제대로 안 실린다. 따로 설치해서 돌릴 거면 --profile이나 --release로 빌드해야 한다. flutter install은 빌드를 새로 하지 않고 이미 만들어진 배포용 파일을 찾는데, 그게 없으면 기존 앱을 먼저 지운 뒤 실패한다. 데이터가 날아간 이유다.
그래서 실기기 확인은 내가 직접 flutter run으로 하기로 했다.
- 판단: 확인하는 방법이 확인하려는 것과 맞는지부터 본다. 설치 방식이 틀리면 고쳐진 코드도 안 고쳐진 것처럼 보인다.
요약
- 예외를 조건문으로 막기보다 구조를 뒤집어 예외가 안 생기게 한다. 배경은 흰색 고정, 색은 테두리로.
- 대비는 기준 색을 진하게 만들어 얻는다.
Color.lerp(색, 검정, 비율). - 보상형 광고는 보상 확정과 광고 닫힘이 서로 다른 신호다. 보상은 확정에서, 화면 정리는 닫힘에서.
- 개발 중 실기기 확인은
flutter run. 따로 설치할 거면--profile이나--release.