Flutter-如何知道 AudioService 已停止?
Flutter- How to know AudioService is stopped?
我正在使用 audio_service flutter 包。如果音频服务停止,我想弹出一个播放器页面。如何获取音频服务停止事件?我没有找到任何事件来检查服务是否停止
(答案更新:从v0.18开始,服务实际上总是运行,而应用程序是运行,所以不再需要检查。以下答案是针对v0的.17 及更早版本。)
AudioService.running
将在服务为 运行 时发出 true
,否则为 false
。
要收听它何时从 true
变为 false
,您可以试试这个:
// Cast runningStream from dynamic to the correct type.
final runningStream =
AudioService.runningStream as ValueStream<bool>;
// Listen to stream pairwise and observe when it becomes false
runningStream.pairwise().listen((pair) {
final wasRunning = pair.first;
final isRunning = pair.last;
if (wasRunning && !isRunning) {
// take action
}
});
如果您想要收听 stopped
播放状态,则需要确保您的后台音频任务实际发出 onStop
中的状态变化:
@override
Future<void> onStop() async {
await _player.dispose();
// the "await" is important
await AudioServiceBackground.setState(
processingState: AudioProcessingState.stopped);
// Shut down this task
await super.onStop();
}
这样,您可以在 UI:
中监听此状态
AudioService.playbackStateStream.listen((state) {
if (state.processingState == AudioProcessingState.stopped)) {
// take action
}
});
我正在使用 audio_service flutter 包。如果音频服务停止,我想弹出一个播放器页面。如何获取音频服务停止事件?我没有找到任何事件来检查服务是否停止
(答案更新:从v0.18开始,服务实际上总是运行,而应用程序是运行,所以不再需要检查。以下答案是针对v0的.17 及更早版本。)
AudioService.running
将在服务为 运行 时发出 true
,否则为 false
。
要收听它何时从 true
变为 false
,您可以试试这个:
// Cast runningStream from dynamic to the correct type.
final runningStream =
AudioService.runningStream as ValueStream<bool>;
// Listen to stream pairwise and observe when it becomes false
runningStream.pairwise().listen((pair) {
final wasRunning = pair.first;
final isRunning = pair.last;
if (wasRunning && !isRunning) {
// take action
}
});
如果您想要收听 stopped
播放状态,则需要确保您的后台音频任务实际发出 onStop
中的状态变化:
@override
Future<void> onStop() async {
await _player.dispose();
// the "await" is important
await AudioServiceBackground.setState(
processingState: AudioProcessingState.stopped);
// Shut down this task
await super.onStop();
}
这样,您可以在 UI:
中监听此状态AudioService.playbackStateStream.listen((state) {
if (state.processingState == AudioProcessingState.stopped)) {
// take action
}
});