Как каждый раз устанавливать разные начальные плейлисты при запуске audio_service/just_audio

В официальном примере для audio_service список воспроизведения предварительно записан (строка 495), поэтому нет необходимости иметь дело с исходным списком воспроизведения, когда мы запускаем аудио. Однако в реальном мире этого почти никогда не бывает, как всякий раз, когда мы audio_service, нам нужен другой начальный плейлист. Как этого добиться?

Некоторые из моих попыток (все неудачные):

  1. Используйте параметр для onStart(). Тем не мение, params принимать только стандартные типы данных Flutter (что-то вроде этого, я забыл, где я нашел официальное название), поэтому единственное, что я могу передать ему, это карты String, int и т. д. Это означает, что мне нужно преобразовать из списка моей собственной модели (назовем ее List<Track>) в a, затем преобразуйте List<Map> к setQueue(), и, наконец, преобразовать List<MediaItem> к ConcatenatedAudioSource для just_audioиграть. Во время этого исчерпывающего списка преобразований многие вещи могут пойти не так (даже при обширном тестировании), например, типы:
      Exception has occurred.
_TypeError (type 'List<Object?>' is not a subtype of type 'List<Map<String, dynamic>>')
  1. Вероятно, более выполнимый: добавьте дополнительный статический метод для AudioPlayerTaskчто обновляет очередь. Базовая реализация ниже. Проблема в том, что он всегда подсказывает мне, что _mediaItemQueue а также _audioSourceQueue не инициализируются, хотя асинхронные функции выполняются в указанном порядке ( Queue update complete! появляется перед Setting audio queue)
      class AudioPlayerTask extends BackgroundAudioTask {
  final _audioPlayer = AudioPlayer();
  static late List<Track> _trackQueue;
  static late List<MediaItem> _mediaItemQueue;
  static late ConcatenatingAudioSource _audioSourceQueue;

  @override
  Future<void> onStart () async {
    // AudioServiceBackground.setState() and other stuffs
    print("Setting audio queue");
    await AudioServiceBackground.setQueue(_mediaItemQueue);
    await _audioPlayer.setAudioSource(_audioSourceQueue);
    onPlay();
  }

  static Future<void> updateCurrentQueue(List<Track> tracks) async {
    _trackQueue = tracks;
    _mediaItemQueue = Parsing.track2MediaItem(tracks);
    _audioSourceQueue = Parsing.track2AudioSource(tracks);

    print('Queue update complete!');
  }
}

// At somewhere else in the app:
onTap: () async {
  await updateCurrentQueue(_queue);
  await AudioService.start(backgroundTaskEntrypoint: backgroundTaskEntrypoint);
}

Что я могу делать? Любая помощь будет оценена по достоинству. Заранее спасибо!

0 ответов

Другие вопросы по тегам