Могу ли я запустить секундомер дротика с начальным значением? - PullRequest
0 голосов
/ 18 июня 2020

Я просматриваю документы Секундомер и уверен, что у них нет способа запустить секундомер с начальным значением.

Я разрабатываю приложение что требует измерения прошедшего времени. Таким образом, секундомер становится здесь очевидным выбором. Однако есть вариант использования, когда пользователи приложения могут случайно закрыть приложение при очистке фоновых приложений.

Поскольку запуск кода дротика без головы в фоновом режиме сейчас довольно расплывчатый, я считаю Лучше всего отслеживать время и временной интервал, если он есть, при возобновлении работы приложения после случайного закрытия. Отдельный объект данных, подобный следующему, может отслеживать время и то, работает ли секундомер ...

class StopwatchTracker{

  final stopwatch;
  final lastUpdated;
  final isRunning;
  final systemTime;

  StopwatchTracker({this.stopwatch, this.lastUpdated, this.isRunning, this.systemTime});

}

С этим у меня есть объект, который имеет данные о времени lastUpdated с секундомера. Сравните это с systemTime, которое будет текущим системным временем устройства. Теперь мы можем увидеть, есть ли разрыв между временем lastUpdated и временем systemTime. Если есть промежуток, секундомер должен «перескочить» на время на «промежутки».

Этот StopwatchTracker объект будет инициализирован только при запуске / возобновлении приложения и каждые несколько секунд будет обновляться время lastUpdated. Я думаю, что logi c есть, но, как я уже упоминал, класс Stopwatch в dart не имеет метода инициализации его начальным значением.

Мне интересно, могу ли я расширить класс Stopwatch для размещения метода для этого. Или второй вариант - обновить сам ellapsedMillis или добавить gap in mills к ellapsedMillis, а затем показать результат на экране.

Будем рады услышать от вас, ребята, по этому поводу!

1 Ответ

0 голосов
/ 19 июня 2020

Да, могу! > Ну да, но на самом деле нет

Я не могу установить начальное значение секундомера для запуска / возобновления в определенное время или даже перенастроить текущее время работы.

Самое простое решение, которое я нашел, - это расширить класс Stopwatch следующим образом:

class StopWatch extends Stopwatch{
  int _starterMilliseconds = 0;

  StopWatch();

  get elapsedDuration{
    return Duration(
      microseconds: 
      this.elapsedMicroseconds + (this._starterMilliseconds * 1000)
    );
  }

  get elapsedMillis{
    return this.elapsedMilliseconds + this._starterMilliseconds;
  }

  set milliseconds(int timeInMilliseconds){
    this._starterMilliseconds = timeInMilliseconds;
  }

}

В настоящее время мне не требуется намного больше от этого кода. Просто запустите секундомер в какой-то момент, а затем продолжайте работать. И его можно легко расширить для других get типов класса Stopwatch.

Вот как я планирую использовать класс

void main() {
  var stopwatch = new StopWatch(); //Creates a new StopWatch, not Stopwatch
  stopwatch.start();               //start method, not overridden
  stopwatch.milliseconds = 10000;  //10 seconds have passed
  print(stopwatch.elapsedDuration);//returns the recalculated duration
  stopwatch.stop();
}

Хочу поиграть с кодом или протестировать это из? Нажмите здесь

...