我在颤振中开发了一个音乐播放器应用程序。
场景:当用户从列表中选择一首歌曲时,一旦选择的歌曲播放完毕,自动需要开始列表中的下一首歌曲。
目前我正在收听流媒体以更新 UI 上的歌曲详细信息和滑块信息PlaybackState
。Position
但是,我无法确定所选歌曲何时播放完毕。这里的想法是,一旦播放了选定的歌曲,就必须播放列表中的下一首歌曲。最初,AudioProcessingState 从连接状态变为就绪状态。第一个媒体项目已成功播放。但,
问题 1:即使在完全播放完第一个媒体项后,AudioProcessingState 仍然存在ready
(未更改为已完成)。就连演奏也true
总是如此。下面是播放和暂停 UI 的逻辑。
StreamBuilder<PlaybackState>(
stream: AudioService.playbackStateStream,
builder: (context, snapshot) {
final processingState = snapshot.data?.processingState;
print('Current Processingstate: $processingState');
final playing = snapshot.data?.playing ?? false;
if (playing)
return IconButton(
iconSize: 40,
onPressed: () {
AudioService.pause();
},
icon: Icon(FontAwesomeIcons.pause,
color: Colors.white));
else
return IconButton(
iconSize: 40,
onPressed: () {
if (AudioService.running) {
AudioService.play();
} else {
List<dynamic> list = [];
for (int i = 0;
i < this.widget.mediaList.length;
i++) {
var m = this.widget.mediaList[i].toJson();
list.add(m);
}
var params = {
"data": list,
'index': this.widget.currentIndex
};
AudioService.connect();
AudioService.start(
backgroundTaskEntrypoint:
_backgroundTaskEntrypoint,
params: params);
}
},
icon: Icon(FontAwesomeIcons.play,
color: Colors.white));
},
),
问题 2:此外,即使在完成所选歌曲后,位置流也会持续接收。因此,我无法停止更新持续时间标签。
StreamBuilder<Duration>(
stream: AudioService.positionStream,
builder: (context, snapshot) {
final mediaState = snapshot.data;
return SeekBar(
duration: this.widget.mediaList[current].duration ??
Duration.zero,
position: aPosition,
onChangeEnd: (newPosition) {
AudioService.seekTo(newPosition);
},
);
},
),
简单来说,
- 我怎样才能知道所选歌曲已播放完毕?
- 歌曲播放完成后如何更新滑块?