フラッターで音楽プレーヤーアプリを開発しています。
シナリオ: ユーザーがリストから 1 つの曲を選択すると、選択した曲が完全に再生されると、リスト内の次の曲を自動的に開始する必要があります。
現在、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: また、選択した曲を終了した後も、Position ストリームが継続的に受信されます。このため、期間ラベルの更新を停止できません。
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);
},
);
},
),
簡単に言えば、
- 選択した曲の再生が完了したことを知るにはどうすればよいですか?
- 曲の再生が完了したら、スライダーを更新する方法は?