使用just_audio与audio_service添加歌曲到队列后无法播放问题
问题原因
你遇到的问题核心是_loadPlaylist方法并不仅仅是加载初始播放列表,同时承担了音频服务的初始化职责:
- 原方法内部会调用
setAudioSource类接口给底层播放器初始化音频源,让播放器从idle状态进入就绪状态 - 注释该方法后,你直接调用
addQueueItem仅完成了播放队列的元数据写入,底层播放器未收到音频源初始化指令,因此一直卡在加载状态,无法读取MediaItem中extras携带的音频url完成加载。
解决方案
以下三个方案可按需选择:
- 补全init方法的初始化逻辑
注释_loadPlaylist后,在init方法中添加空音频源初始化逻辑,替代原方法的初始化作用,示例代码:
void init() async { // 新增空音频源初始化,对应原_loadPlaylist中的初始化动作 await _audioHandler.setAudioSource(ConcatenatingAudioSource(children: [])); _listenToPlaybackState(); _listenToCurrentPosition(); _listenToBufferedPosition(); _listenToTotalDuration(); _listenToChangesInSong(); _listenToChangesInPlaylist(); }
- 首次添加歌曲时主动触发加载
修改addMessageToPlayer方法,判断如果是队列首次添加内容,添加完成后主动触发播放器准备逻辑:
addMessageToPlayer( {required String id, required String title, required String album, required String url, required String artUri}) async { final mediaItem = MediaItem( id: id, title: title, album: album, extras: { 'url': url, 'artUri': artUri, }, ); await _audioHandler.addQueueItem(mediaItem); // 新增:如果添加前队列为空,主动触发加载 if(_audioHandler.queue.value.length == 1){ await _audioHandler.seek(Duration.zero, index: 0); // 若需要自动播放可补充调用 _audioHandler.play(); } }
- 抽离
_loadPlaylist的初始化逻辑
如果原_loadPlaylist方法中只有初始列表加载是你不需要的,直接将方法内的音频服务初始化代码抽出来放到init中执行即可,无需完全注释整个方法。
内容的提问来源于stack exchange,提问作者Zionnite
相关产品推荐
相关产品推荐

