保持 Flutter 的just_audio和audio_service同步以进行随机播放模式



我正在Flutter中使用Just audio实现音频服务的基本版本。我已经解决了大部分功能,但我不知道如何在洗牌和取消洗牌时保持MediaItem队列与音频播放器的播放列表同步。

这就是我迄今为止所尝试的:

@override
Future<void> setShuffleMode(AudioServiceShuffleMode shuffleMode) async {
final oldIndices = _player.effectiveIndices!;
switch (shuffleMode) {
case AudioServiceShuffleMode.none:
final list = List.generate(
oldIndices.length, (index) => queue.value![oldIndices[index]]);
queue.add(list);
_player.setShuffleModeEnabled(false);
break;
case AudioServiceShuffleMode.group:
case AudioServiceShuffleMode.all:
_player.setShuffleModeEnabled(true);
_player.shuffle();
final playlist =
oldIndices.map((index) => queue.value![index]).toList();
queue.add(playlist);
break;
}
}

这会在搅乱后更新队列,但不允许它返回。我确信肯定有一个简单的解决方案,但我的大脑无法理解。官方的例子并没有展示洗牌。

我建议将每个音频服务MediaItem存储在每个just_audioIndexedAudioSourcetag属性中。然后,您可以轻松地将just_audio的有效序列映射到队列:

_player.sequenceStateStream
.map((state) => state?.effectiveSequence)
.distinct()
.map((sequence) =>
(sequence ?? []).map((source) => source.tag as MediaItem).toList())
.pipe(queue);

最新更新