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

just_audio的shuffleIndicesStream返回异常顺序,播放列表创建时未洗牌

问题分析与解决方案

根源

AudioHandler(尤其是它的默认实现BaseAudioHandler)内部会自动生成随机洗牌索引,哪怕你没有主动调用任何洗牌相关方法。这是因为底层默认逻辑会在初始化阶段或者播放器状态变更时,自动填充随机的shuffleIndices值,和你自己写的洗牌方法无关——所以移除自己的方法不会改变这个行为。

解决步骤

  • 初始化时强制设置原顺序索引
    在你的MyAudioHandler初始化时,直接给shuffleIndices发送播放列表的原顺序索引,覆盖默认的随机值:

    class MyAudioHandler extends BaseAudioHandler {
      MyAudioHandler(List<MediaItem> mediaItems) {
        // 生成和播放列表顺序一致的索引
        final originalIndices = List.generate(mediaItems.length, (index) => index);
        // 发送到流中,覆盖默认的随机索引
        shuffleIndices.add(originalIndices);
      }
    }
    
  • 显式关闭底层播放器的洗牌模式
    如果你用的是just_audio这类底层播放器,确保初始化时关闭洗牌模式:

    final player = AudioPlayer();
    // 强制关闭洗牌,避免底层触发索引变更
    await player.setShuffleModeEnabled(false);
    
  • 覆盖默认的shuffle方法
    BaseAudioHandler的默认shuffle方法会生成随机索引,你可以覆盖它让它不执行任何操作:

    @override
    Future<void> shuffle() async {
      // 空实现,阻止默认的随机索引生成逻辑
    }
    
  • 过滤监听时的初始空列表(可选)
    如果只是不想处理初始的空列表,可以在监听时跳过:

    myAudioHandler.shuffleIndicesStream
        .where((indices) => indices.isNotEmpty)
        .listen((indices) {
          // 处理非空的索引列表
        });
    

内容的提问来源于stack exchange,提问作者Sirojiddin Odamboyev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:22:42