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
相关产品推荐
相关产品推荐

