【问题标题】:Differenciating stop and dispose with audio_service's AudioHandler for Flutter app使用 Flutter 应用程序的 audio_service 音频处理程序区分停止和处理
【发布时间】:2021-09-09 08:35:11
【问题描述】:

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

【问题讨论】:

    标签: flutter dart just-audio audio-service


    【解决方案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 的简单应用来说,这种方法可能已经足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多