Flutter stopwatchtimer 不响应更改时间

Flutter stopwatchtimer doesn't respond to changing time

我在我的应用程序中使用这个包 https://pub.dev/packages/stop_watch_timer 来跟踪正在播放的音乐。但是,如果我想通过更改秒表上的时间来更改歌曲,它会说我必须先重置计时器,我已经这样做了。如果我第二次按下按钮,它就会工作。这是代码:

  final StopWatchTimer _stopWatchTimer = StopWatchTimer(
    mode: StopWatchMode.countUp,
    onChangeRawSecond: (value) => print('onChangeRawSecond $value'),
  );



  void change_timer_value(int song_index) {
    int new_time = TimerState(
            song_index: song_index,
            record_side: current_side_list(
                record_sides[selectedValue], widget.album_data))
        .get_start_value();
    print(new_time);

    _stopWatchTimer.onExecute.add(StopWatchExecute.reset);
    _stopWatchTimer.setPresetSecondTime(new_time); // this is where I set new time
  }

我不知道如何解决这个问题。我已经在创作者 GitHub 上创建了一个问题,但没有回应。所以这里有人可以帮助我

正如您在 github 问题中提到的,问题的根本原因似乎是重置操作是异步发生的,因此在您尝试设置时尚未完成时间。

解决这个问题的一种方法是定义您自己的异步函数来重置秒表,然后等待操作完成再返回:

Future<void> _resetTimer() {
  final completer = Completer<void>();

  // Create a listener that will trigger the completer when
  // it detects a reset event.
  void listener(StopWatchExecute event) {
    if (event == StopWatchExecute.reset) {
      completer.complete();
    }
  }

  // Add the listener to the timer's execution stream, saving
  // the sub for cancellation
  final sub = _stopWatchTimer.execute.listen(listener);

  // Send the 'reset' action
  _stopWatchTimer.onExecute.add(StopWatchExecute.reset);

  // Cancel the sub after the future is fulfilled.
  return completer.future.whenComplete(sub.cancel);
}

用法:

void change_timer_value(int song_index) {
  int new_time = TimerState(
          song_index: song_index,
          record_side: current_side_list(
              record_sides[selectedValue], widget.album_data))
      .get_start_value();
  print(new_time);

  _resetTimer().then(() {
    _stopWatchTimer.setPresetSecondTime(new_time);
  });
}

或(async/await):

void change_timer_value(int song_index) async {
  int new_time = TimerState(
          song_index: song_index,
          record_side: current_side_list(
              record_sides[selectedValue], widget.album_data))
      .get_start_value();
  print(new_time);

  await _resetTimer();
  _stopWatchTimer.setPresetSecondTime(new_time);
}