1

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);
4

1 回答 1

1

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

于 2021-06-27T02:40:21.610 回答