티스토리 뷰

개요

 

 

모종의 이유로 운동을 오랫동안 하지 않게 된다면

수행능력이 퇴하하게 되고 이는 의욕상실 이어지게 된다.

 

몸을 만드려면 꾸준하게 운동을 하여

점진적 과부화의 원리를 적용해 수행능력을 늘려나가야 한다.

 

그런 의미에서 운동을 하지 않게 될 때 나 자신에게 경각심을 주기 위해

일정 시간이 지나면 일지를 초기화시키는 타이머를 홈화면에 배치할 것이다.

 

원래는 일지 초기화까지의 시간을 3일로 하려고 했는데

여행을 가거나 아플 때도 있다는 걸 고려해서 1주일로 하기로 했다.

 

 

운동기록 초기화 타이머 구현

 

일지 데이터에 필요한 키값 추가 

_controller.addData({
  'time': DateTime.now().toString(),
  'day': _controller.dataList.length + 1,
  'ex1_name': '풀업',
  'ex2_name': '푸쉬업',
  'ex1': [11, 8, 5],
  'ex2': [30, 22, 12]
});

일지 데이터(json 자료형)에 'time' 이라는 키를 추가할 것이다.

time의 키값으로는 운동을 마친 시간이 문자열 형태로 들어가게 된다. 

 

 

DateTime.now()는 현재 시간에 해당하는 DateTime값이며

Json에서 DateTime값을 그냥 가져오면 위와 같은 오류가 발생하기에

현재 시간을 문자열로 변환해서 저장하였다. 

 

 

일지 초기화 시점 반환

DateTime noteInitTime() {
  return DateTime.parse(dataList.last['time']).add(const Duration(days: 7));
}

일지를 초기화 하는 시점의 시간을 반환하는 함수이다.

마지막으로 운동을 끝마친 시점에서 1주일을 더한 DateTime값을 반환한다.

 

time 키값은 문자열에 해당하기에 DateTime.parse()로 형변환을 해줘야한다.

 

 

DateTime 문자열 포맷팅

2024-05-12 01:27:26.252709

DateTime.now()를 콘솔에 찍어보면 위와같은 값을 확인할 수 있다.

 

 

 

String formatDuration(Duration duration) {
  String twoDigits(int n) {
    if (n >= 10) return "$n";
    return "0$n";
  }

  String twoDigitHours = twoDigits(duration.inHours);
  String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60));
  String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));

  return "$twoDigitHours:$twoDigitMinutes:$twoDigitSeconds";
}

분과 초에 해당하는 문자열이 한 자리수에 해당한다면 앞에 '0'을 붙여준다.

해당 함수는 (일지 초기화 시점 - 현재 시간)값을 인자값으로 받아 "시:분:초" 형태의 문자열을 반환한다.

 

 

1주일이 지나면 일지를 초기화

void checkTimeDifference(BuildContext context) {
  if (dataList.isNotEmpty) {
    if (DateTime.now().difference(DateTime.parse(dataList.last['time'])).inDays >= 7) {
      deleteData();
    }
    notifyListeners();
  }
}

운동기록이 존재한다면 마지막으로 운동을 끝마친 시점에서

1주일이 지났을 때 운동일지를 초기화하는 함수이다.

 

마지막으로 남은 시간을 실시간으로 보여주려면

notifyListeners()를 호출하여 앱에 변경사항을 알려야 한다.

 

 

타이머 작동시키기

late Timer timer;

컨트롤러에 타이머 함수를 추가한다.

 

 

 

@override
void initState() {
  super.initState();
  _controller.initDataList();
  _controller.timer = Timer.periodic(const Duration(seconds: 1), (timer) {
    _controller.checkTimeDifference(context);
  });
}

홈 화면의 initState에서 타이머를 초기화 해준다.

 

1초마다 checkTimeDifference 함수를 실행시켜 남은 시간을 업데이트하고

지정한 시점에 도달하면 운동일지를 초기화시킨다.

앱을 새로고침하면 변경사항이 적용된다.

 

 

@override
  void dispose() {
    super.dispose();
    _controller.timer.cancel();
  }

불필요하게 타이머가 실행이 된다면 앱의 성능에 영향을 주고 버그를 유발할 가능성이 있다.

따라서 사용하지 않는 타이머는 dispose하여 해당 리소스를 해제해줘야 한다. 

 

 

남은 시간 출력

Text(
  _controller.formatDuration(_controller.noteInitTime().difference(DateTime.now())),
  style: TextStyles.caption1.copyWith(
  	  color: context.isLight
		  ? LightModeColors.red
 		  : DarkModeColors.red),
),

difference함수를 통해 실시간으로 일지 초기화 시점에 해당하는 시간값에서

현재의 시간을 뺀 DateTime값을 formatDuraiton의 인자값으로 넘겨주어

결과적으로 일지 초기화까지 남은 시간을 "시:분:초" 형태로 출력한다.

 

 

 

테스트

 

테스트를 위해 일지 초기화 시점을 임시적으로

마지막으로 운동한 시간 + 5초 뒤로 설정했다.

 

 

 

깃허브

 

GitHub - hamond12/EscapeAnchovy: 운동일지 앱

운동일지 앱. Contribute to hamond12/EscapeAnchovy development by creating an account on GitHub.

github.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함