You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:30:58