如何在播放队列中的下一个 mediaItem 时更改当前 mediaItem

How to change the current mediaItem when the next mediaItem in the queue is played

我正在 Flutter 中开发一个 iOS 应用程序,使用名为 audio_service 的包。 我使用 AudioServiceBackground.serQueue() 将多个 MediaItem 设置为一个队列。

在UI部分,我尝试使用AudioService.currentMediaItemStream来显示当前播放的媒体项目的信息。

队列中的第一首歌曲播放完毕后,将播放第二首歌曲。但是,当前媒体项的信息没有改变。

如何检测队列中正在播放的歌曲发生了变化?

class AudioServiceScreen extends StatefulWidget {
  @override
  _AudioServiceScreenState createState() => _AudioServiceScreenState();
}

class _AudioServiceScreenState extends State<AudioServiceScreen> {
  @override
  void initState() {
    super.initState();
    Future(() async {
      await AudioService.connect();
      await start();
    });
  }

  @override
  void dispose() {
    Future(() async {
      await AudioService.disconnect();
    });
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: ///,
      body: StreamBuilder<MediaItem?>(
        stream: AudioService.currentMediaItemStream,
        builder: (context, snapshot) {
          final mediaItem = snapshot.data;
        },
      ),
    );
  }

  Future<dynamic> start() async {
    final success = await AudioService.start(
      backgroundTaskEntrypoint: _backgroundTaskEntrypoint,
    );
    if (success) {
      await updateQueue();
    }
  }

  Future<void> updateQueue() async {
    final queue = await getMediaLibrary();  // get data from FireStore
    await AudioService.updateQueue(queue);
  }
}

void _backgroundTaskEntrypoint() {
  AudioServiceBackground.run(() => AudioPlayerTask());
}

class AudioPlayerTask extends BackgroundAudioTask {
  final AudioPlayer audioPlayer = AudioPlayer();

  @override
  Future<void> onStart(Map<String, dynamic>? params) async {
    final session = await AudioSession.instance;
    await session.configure(const AudioSessionConfiguration.speech());

    await AudioServiceBackground.setState(
      controls: [MediaControl.pause, MediaControl.stop],
      playing: false,
      processingState: AudioProcessingState.connecting,
    );
  }

  @override
  Future<void> onUpdateQueue(List<MediaItem> queue) async {
    await AudioServiceBackground.setQueue(queue);

    try {
      await audioPlayer.setAudioSource(ConcatenatingAudioSource(
        children:
            queue.map((item) => AudioSource.uri(Uri.parse(item.id))).toList(),
      ));
    } on Exception catch (e) {
      await onStop();
    }
  }
}

尝试阅读文档并按照其中的一些示例进行操作。因为在“背景代码”部分,有“开始”代码。也许该代码可以帮助您。很抱歉我帮不了你那么多。我从来没有尝试过那个包。