使用 audio_service 的 AudioHandler for Flutter 应用区分停止和处理
Differenciating stop and dispose with audio_service's AudioHandler for Flutter app
just_audio AudioPlayer 允许您停止和处理:
_player.stop();
_player.dispose();
当您以后可能还想重新开始玩时,您可以使用 stop
,而 dispose
用于当您完全玩完时。
我的问题是包装 just_audio AudioPlayer 的 audio_service AudioHandler 只有一个 stop
方法。没有dispose
.
添加自定义操作是否正确?
@override
Future customAction(String name, Map<String, dynamic>? arguments) async {
if (name == 'dispose') {
await _player.dispose();
await super.stop();
}
}
并这样称呼它:
myAudioHandler.customAction('dispose', null);
假设从 0.18.0 开始,是的,这是正确的。作为一个细微的改进,您还可以选择将自定义操作调用包装在扩展方法中:
extension AudioHandlerExtension on AudioHandler {
Future<void> dispose() => customAction('dispose');
}
那么你可以这样称呼它:
await myAudioHandler.dispose();
还有另一种方法有点作弊,那就是:与其使用自定义操作,不如直接向处理程序添加 dispose
方法 class:
class MyAudioHandler extends BaseAudioHandler {
...
Future<void> dispose() => _player.dispose();
}
然后保留对 MyAudioHandler
实例的类型化引用,以便您以后可以直接在其上调用 dispose
方法:
myAudioHandler = await AudioService.init(
builder: () => MyAudioHandler(),
}
...
await myAudioHandler.dispose();
您只需要了解以下限制:
- 如果您有多个音频处理程序 class 组合在一起,此
dispose
方法将不会传播到所有这些,该方法仅在 MyAudioHandler
中可用class.
- 这仅在您从同一个隔离区调用时才有效。
- 如果您的应用旨在响应来自另一个进程的自定义操作,则此方法不支持。
对于不使用组合、多个隔离或 IPC 的简单应用程序,这种方法可能已经足够好了。
just_audio AudioPlayer 允许您停止和处理:
_player.stop();
_player.dispose();
当您以后可能还想重新开始玩时,您可以使用 stop
,而 dispose
用于当您完全玩完时。
我的问题是包装 just_audio AudioPlayer 的 audio_service AudioHandler 只有一个 stop
方法。没有dispose
.
添加自定义操作是否正确?
@override
Future customAction(String name, Map<String, dynamic>? arguments) async {
if (name == 'dispose') {
await _player.dispose();
await super.stop();
}
}
并这样称呼它:
myAudioHandler.customAction('dispose', null);
假设从 0.18.0 开始,是的,这是正确的。作为一个细微的改进,您还可以选择将自定义操作调用包装在扩展方法中:
extension AudioHandlerExtension on AudioHandler {
Future<void> dispose() => customAction('dispose');
}
那么你可以这样称呼它:
await myAudioHandler.dispose();
还有另一种方法有点作弊,那就是:与其使用自定义操作,不如直接向处理程序添加 dispose
方法 class:
class MyAudioHandler extends BaseAudioHandler {
...
Future<void> dispose() => _player.dispose();
}
然后保留对 MyAudioHandler
实例的类型化引用,以便您以后可以直接在其上调用 dispose
方法:
myAudioHandler = await AudioService.init(
builder: () => MyAudioHandler(),
}
...
await myAudioHandler.dispose();
您只需要了解以下限制:
- 如果您有多个音频处理程序 class 组合在一起,此
dispose
方法将不会传播到所有这些,该方法仅在MyAudioHandler
中可用class. - 这仅在您从同一个隔离区调用时才有效。
- 如果您的应用旨在响应来自另一个进程的自定义操作,则此方法不支持。
对于不使用组合、多个隔离或 IPC 的简单应用程序,这种方法可能已经足够好了。