发生此错误是因为currentIndexStream
是“同步”广播流,因此在处理当前事件时(即在事件循环的同一循环中),您无法触发另一个状态更改事件。但是你可以通过在当前周期之后安排一个微任务来解决这个问题:
_voiceAudioPlayer.currentIndexStream.listen((index) {
scheduleMicrotask(() async {
_voiceAudioPlayer.pause();
await Future.delayed(Duration(seconds: 4));
_voiceAudioPlayer.play();
});
});
尽管如此,由于 just_audio 的播放列表的无缝特性,我不会依赖这个回调很快就会执行。也就是说,下一个音轨将立即开始播放,因此在暂停发生之前,您肯定会听到至少一小部分下一个项目的音频。
有一个开放的功能请求SilenceAudioSource
可以插入到播放列表中(如果您希望实现它,可以通过单击大拇指按钮来投票支持该问题。)您提出的无声音频文件实际上是最简单的替代SilenceAudioSource
.
否则,另一种方法是根本不使用无间隙播放列表功能(因为您不需要无间隙功能),只需实现您自己的逻辑来推进队列:
final queue = [source1, source2, source3, ...];
for (var source in queue) {
await _voiceAudioPlayer.setAudioSource(source);
await _voiceAudioPlayer.play();
await Future.delayed(seconds: 4);
}
上面的示例不处理暂停/恢复逻辑,但这只是为了表明如果您不需要无缝功能,您可以将播放列表逻辑掌握在自己手中。