Flutter使用just_audio插件实现上/下一曲功能遇阻求助
解决just_audio实现下一曲切换的问题
你当前的下一曲按钮失效,核心原因是仅设置了单个音频源,just_audio的seekToNext()依赖完整的播放序列才能工作,单个音频源不存在“下一曲”的概念,因此hasNext始终为false,点击无响应。以下是具体修复步骤:
1. 构建完整的播放序列
先将所有歌曲的URI转换为AudioSource列表,再用ConcatenatingAudioSource包装,让播放器识别整个播放队列:
// 从歌曲列表生成音频源序列 final audioSequence = ConcatenatingAudioSource( children: item.data!.map((song) => AudioSource.uri(Uri.parse(song.uri!))).toList(), );
2. 修改播放方法,支持序列播放
替换原playmusic方法,改为设置整个音频序列,并支持从指定歌曲索引开始播放:
void playSongAtIndex(int index) async { try { await widget.audioPlayer.setAudioSource( ConcatenatingAudioSource( children: item.data!.map((song) => AudioSource.uri(Uri.parse(song.uri!))).toList(), ), initialIndex: index, // 从选中的歌曲开始播放 ); await widget.audioPlayer.play(); } catch (e) { debugPrint('播放错误: $e'); } }
3. 更新列表项的点击逻辑
把原来的播放调用改成传入当前歌曲索引,初始化完整播放序列:
ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: item.data!.length, itemBuilder: (context, index) { return ListTile( title: Text(item.data![index].title), trailing: IconButton( icon: const Icon(Icons.play_arrow), onPressed: () { playSongAtIndex(index); }, ), ); }, )
4. 修正下一曲按钮的StreamBuilder
原代码中StreamBuilder的builder参数错误,第二个参数是AsyncSnapshot<SequenceState?>而非索引,修正后可正确监听序列状态:
StreamBuilder<SequenceState?>( stream: widget.audioPlayer.sequenceStateStream, builder: (context, snapshot) { final hasNext = snapshot.data?.hasNext ?? false; return IconButton( onPressed: hasNext ? () => widget.audioPlayer.seekToNext() : null, icon: const Icon( Icons.skip_next, size: 45.0, color: Colors.white, ), disabledColor: Colors.white30, ); }, )
内容的提问来源于stack exchange,提问作者user15141168
相关产品推荐
相关产品推荐

