我正在使用名为audio_service的包在 Flutter 中开发 iOS 应用程序。我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();
}
}
}