just_audio AudioPlayer允许您停止和处理:
_player.stop();
_player.dispose();
当你将来可能还想重新开始比赛时,你可以使用stop
,而dispose
是当你完全结束比赛时使用的。
我的问题是,包装just_audio AudioPlayer的audio_serviceAudioHandler只有一个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 MyAudioHandler extends BaseAudioHandler {
...
Future<void> dispose() => _player.dispose();
}
然后保留对MyAudioHandler
实例的类型化引用,以便以后可以直接在其上调用dispose
方法:
myAudioHandler = await AudioService.init(
builder: () => MyAudioHandler(),
}
...
await myAudioHandler.dispose();
您只需要注意以下限制:
- 如果您有多个组合在一起的音频处理程序类,则此
dispose
方法不会在所有这些类中传播,该方法将仅在MyAudioHandler
类中可用 - 只有当你从同一个隔离区打电话时,这才有效
- 如果你的应用程序是为响应来自另一个进程的自定义操作而设计的,那么这种方法将不支持这一点
对于不使用组合、多个隔离或IPC的简单应用程序来说,这种方法可能足够好了。