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

Keeping Flutter's just_audio and audio_service in sync for shuffle mode

我正在使用 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;
    }
  }

这会在洗牌后更新队列,但不允许它返回。我敢肯定一定有一个简单的解决方案,但我的大脑无法理解。 official example 没有演示洗牌。

我建议将每个 audio_service MediaItem 存储在每个 just_audio IndexedAudioSourcetag 属性 中。然后就可以方便的将just_audio的有效序列映射到队列中:

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