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