Нет способа изменить интервал Timer
во время его работы, поэтому единственный способ - запустить новый с измененным интервалом, как вы делаете.
Однако, могу ли я предложить альтернативное решение, где вместо отмены предыдущего таймера вы ждете его завершения, прежде чем запустить новый. Это устранило бы образовавшуюся «пропасть». (Интересно, что управление с Timer.periodic
может быть немного раздражающим, поэтому вы можете попробовать использовать простой Timer
.)
class Metronome {
double tempo;
bool active = false;
Metronome([this.tempo = 60.0]);
void start() {
active = true;
Timer(_getDuration(), _handleEvent);
}
void stop() {
active = false;
}
void _handleEvent() {
// TODO: Handle metronome event, e.g. make the tick sound
if (active) {
Timer(_getDuration(), _handleEvent);
}
}
Duration _getDuration() {
final time = 1 / tempo;
return Duration(
seconds: time.toInt(),
milliseconds: (time * 1000).toInt() % 1000,
microSeconds: (time * 1000000).toInt() % 1000,
);
}
}