Как каждый раз устанавливать разные начальные плейлисты при запуске audio_service/just_audio
В официальном примере для audio_service список воспроизведения предварительно записан (строка 495), поэтому нет необходимости иметь дело с исходным списком воспроизведения, когда мы запускаем аудио. Однако в реальном мире этого почти никогда не бывает, как всякий раз, когда мы
audio_service
, нам нужен другой начальный плейлист. Как этого добиться?
Некоторые из моих попыток (все неудачные):
- Используйте параметр для
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>>')
- Вероятно, более выполнимый: добавьте дополнительный статический метод для
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);
}
Что я могу делать? Любая помощь будет оценена по достоинству. Заранее спасибо!