1

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

这会在洗牌后更新队列,但不允许它返回。我确信必须有一个简单的解决方案,但我的大脑无法掌握它。官方示例没有演示洗牌。

4

1 回答 1

1

我建议将每个 audio_service 存储在每个 just_audioMediaItemtag属性中IndexedAudioSource。然后就可以轻松地将 just_audio 的有效序列映射到队列中:

_player.sequenceStateStream
    .map((state) => state?.effectiveSequence)
    .distinct()
    .map((sequence) =>
        sequence?.map((source) => source.tag as MediaItem).toList())
    .pipe(queue);
于 2021-05-22T12:14:56.813 回答