使用audio_service的 AudioHandler for Flutter 应用程序进行不同的停止和处置



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的简单应用程序来说,这种方法可能足够好了。

最新更新