Timer ist running most of the time with 3 different sounds
parent
fb31d1db2c
commit
f38b2fd903
Binary file not shown.
BIN
assets/beep.mp3
BIN
assets/beep.mp3
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -12,11 +12,15 @@ class IntervalTimerPage extends StatefulWidget {
|
||||||
class _IntervalTimerPageState extends State<IntervalTimerPage> {
|
class _IntervalTimerPageState extends State<IntervalTimerPage> {
|
||||||
final Duration _warmupDuration = const Duration(seconds: 5);
|
final Duration _warmupDuration = const Duration(seconds: 5);
|
||||||
final Duration _cooldownDuration = const Duration(seconds: 5);
|
final Duration _cooldownDuration = const Duration(seconds: 5);
|
||||||
final Duration _highIntensityDuration = const Duration(seconds: 4);
|
final Duration _highIntensityDuration = const Duration(seconds: 3);
|
||||||
final Duration _lowIntensityDuration = const Duration(seconds: 3);
|
final Duration _lowIntensityDuration = const Duration(seconds: 2);
|
||||||
late Duration _totalDuration = const Duration(seconds: 35);
|
late Duration _totalDuration = const Duration(minutes: 35);
|
||||||
|
final highIntensityPlayer = AudioPlayer();
|
||||||
|
final lowIntensityPlayer = AudioPlayer();
|
||||||
|
final coolDownPlayer = AudioPlayer();
|
||||||
final int _numHighIntensityBlocks = 4;
|
final int _numHighIntensityBlocks = 4;
|
||||||
final int _numLowIntensityBlocks = 3;
|
final int _numLowIntensityBlocks = 3;
|
||||||
|
|
||||||
Timer? _timer;
|
Timer? _timer;
|
||||||
int _currentBlock = 0;
|
int _currentBlock = 0;
|
||||||
Duration _currentDuration = const Duration();
|
Duration _currentDuration = const Duration();
|
||||||
|
@ -36,15 +40,19 @@ class _IntervalTimerPageState extends State<IntervalTimerPage> {
|
||||||
|
|
||||||
void _startTimer() {
|
void _startTimer() {
|
||||||
_isPaused = false;
|
_isPaused = false;
|
||||||
|
() async {
|
||||||
|
await AudioPlayer().play(UrlSource('assets/go.mp3'));
|
||||||
|
}();
|
||||||
_timer = Timer.periodic(const Duration(seconds: 1), (_) => _tick());
|
_timer = Timer.periodic(const Duration(seconds: 1), (_) => _tick());
|
||||||
}
|
Future.delayed(const Duration(seconds: 1)).then((value) {
|
||||||
|
_playHighIntensityMusic();
|
||||||
void _pauseTimer() {
|
});
|
||||||
_isPaused = true;
|
|
||||||
_timer?.cancel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _resetTimer() {
|
void _resetTimer() {
|
||||||
|
coolDownPlayer.stop();
|
||||||
|
highIntensityPlayer.stop();
|
||||||
|
lowIntensityPlayer.stop();
|
||||||
_isPaused = true;
|
_isPaused = true;
|
||||||
_timer?.cancel();
|
_timer?.cancel();
|
||||||
_currentBlock = 0;
|
_currentBlock = 0;
|
||||||
|
@ -53,9 +61,20 @@ class _IntervalTimerPageState extends State<IntervalTimerPage> {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _playSoundEffect() async {
|
Future<void> _playHighIntensityMusic() async {
|
||||||
final player = AudioPlayer();
|
await highIntensityPlayer.setReleaseMode(ReleaseMode.loop);
|
||||||
await player.play(UrlSource('assets/beep.mp3'));
|
await highIntensityPlayer.play(UrlSource('assets/warmUp.mp3'));
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _playLowIntensityMusic() async {
|
||||||
|
await highIntensityPlayer.stop();
|
||||||
|
Future.delayed(const Duration(microseconds: 600)).then((value) async {
|
||||||
|
await lowIntensityPlayer.play(UrlSource('assets/workout.mp3'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _intervalChange() async {
|
||||||
|
await AudioPlayer().play(UrlSource('assets/beep.mp3'));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _tick() {
|
void _tick() {
|
||||||
|
@ -66,27 +85,35 @@ class _IntervalTimerPageState extends State<IntervalTimerPage> {
|
||||||
_totalDuration = Duration(
|
_totalDuration = Duration(
|
||||||
seconds: _totalDuration.inSeconds - 1,
|
seconds: _totalDuration.inSeconds - 1,
|
||||||
);
|
);
|
||||||
if (_currentDuration.inSeconds == 0) {
|
if (_currentDuration.inSeconds < 1) {
|
||||||
_playSoundEffect();
|
if (_currentBlock < _numHighIntensityBlocks + _numLowIntensityBlocks) {
|
||||||
}
|
_intervalChange();
|
||||||
if (_currentDuration.inSeconds < 0) {
|
if (_currentBlock == 0) {
|
||||||
if (_currentBlock == 0) {
|
_playLowIntensityMusic();
|
||||||
// Start high intensity blocks.
|
}
|
||||||
_currentBlock++;
|
_currentBlock++;
|
||||||
_currentDuration = _highIntensityDuration;
|
|
||||||
} else if (_currentBlock <= _numHighIntensityBlocks) {
|
if (_currentBlock % 2 == 1) {
|
||||||
// Start low intensity blocks.
|
_currentDuration = _highIntensityDuration;
|
||||||
|
} else {
|
||||||
|
_currentDuration = _lowIntensityDuration;
|
||||||
|
}
|
||||||
|
} else if (_currentBlock < _numHighIntensityBlocks * 2) {
|
||||||
|
_intervalChange();
|
||||||
_currentBlock++;
|
_currentBlock++;
|
||||||
_currentDuration = _lowIntensityDuration;
|
|
||||||
} else if (_currentBlock <=
|
|
||||||
_numHighIntensityBlocks + _numLowIntensityBlocks) {
|
|
||||||
// Start high intensity blocks again.
|
|
||||||
_currentBlock++;
|
|
||||||
_currentDuration = _highIntensityDuration;
|
|
||||||
} else {
|
|
||||||
// End workout.
|
|
||||||
_currentDuration = _cooldownDuration;
|
_currentDuration = _cooldownDuration;
|
||||||
_pauseTimer();
|
() async {
|
||||||
|
await lowIntensityPlayer.stop();
|
||||||
|
await coolDownPlayer.play(UrlSource('assets/cool_down.mp3'));
|
||||||
|
}();
|
||||||
|
} else {
|
||||||
|
() async {
|
||||||
|
Future.delayed(const Duration(microseconds: 900))
|
||||||
|
.then((value) async {
|
||||||
|
await AudioPlayer().play(UrlSource('assets/finish.mp3'));
|
||||||
|
});
|
||||||
|
}();
|
||||||
|
_resetTimer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -108,53 +135,50 @@ class _IntervalTimerPageState extends State<IntervalTimerPage> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('Interval Timer'),
|
|
||||||
),
|
|
||||||
body: Center(
|
body: Center(
|
||||||
child: Column(
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
_currentBlock == 0
|
||||||
|
? 'Warm-up'
|
||||||
|
: _currentBlock % 2 == 1
|
||||||
|
? 'High Intensity'
|
||||||
|
: _currentBlock < _numHighIntensityBlocks * 2
|
||||||
|
? 'Low Intensity'
|
||||||
|
: 'Cool-down',
|
||||||
|
style: const TextStyle(fontSize: 32.0),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16.0),
|
||||||
|
Text(
|
||||||
|
_formatDuration(_currentDuration),
|
||||||
|
style: const TextStyle(fontSize: 80.0),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 32.0),
|
||||||
|
Text(
|
||||||
|
'Total: ${_formatTotalDuration(_totalDuration)}',
|
||||||
|
style: const TextStyle(fontSize: 24.0),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 32.0),
|
||||||
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
IconButton(
|
||||||
_currentBlock == 0
|
icon: Icon(
|
||||||
? 'Warm-up'
|
_isPaused ? Icons.play_arrow_rounded : Icons.stop_rounded),
|
||||||
: _currentBlock <= _numHighIntensityBlocks
|
iconSize: 48.0,
|
||||||
? 'High Intensity'
|
onPressed: () {
|
||||||
: 'Low Intensity',
|
if (_isPaused) {
|
||||||
style: const TextStyle(fontSize: 32.0),
|
_startTimer();
|
||||||
),
|
} else {
|
||||||
const SizedBox(height: 16.0),
|
_resetTimer();
|
||||||
Text(
|
}
|
||||||
_formatDuration(_currentDuration),
|
},
|
||||||
style: const TextStyle(fontSize: 80.0),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 32.0),
|
|
||||||
Text(
|
|
||||||
'Total: ${_formatTotalDuration(_totalDuration)}',
|
|
||||||
style: const TextStyle(fontSize: 24.0),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 32.0),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
IconButton(
|
|
||||||
icon: Icon(_isPaused
|
|
||||||
? Icons.play_arrow_rounded
|
|
||||||
: Icons.stop_rounded),
|
|
||||||
iconSize: 48.0,
|
|
||||||
onPressed: () {
|
|
||||||
if (_isPaused) {
|
|
||||||
_startTimer();
|
|
||||||
} else {
|
|
||||||
_pauseTimer();
|
|
||||||
_resetTimer();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
// ),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
|
// ),
|
||||||
],
|
],
|
||||||
)));
|
),
|
||||||
|
],
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,6 +63,11 @@ flutter:
|
||||||
# To add assets to your application, add an assets section, like this:
|
# To add assets to your application, add an assets section, like this:
|
||||||
assets:
|
assets:
|
||||||
- beep.mp3
|
- beep.mp3
|
||||||
|
- go.mp3
|
||||||
|
- workout.mp3
|
||||||
|
- warmUp.mp3
|
||||||
|
- cool_down.mp3
|
||||||
|
- finish.mp3
|
||||||
# - images/a_dot_burr.jpeg
|
# - images/a_dot_burr.jpeg
|
||||||
# - images/a_dot_ham.jpeg
|
# - images/a_dot_ham.jpeg
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue