0

我有以下代码,我使用just_audio作为我的音频播放器。我的问题是我想在用户离开应用程序时暂停、取消暂停音频。我通过以下方式成功完成了这一点:

@override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    audioPlayer.dispose();
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed) {
      if (isPaused) {
        isPaused = false;
        audioPlayer.play();
      }
    } else if (state == AppLifecycleState.paused) {
      if (audioPlayer.playing) {
        isPaused = true;
        audioPlayer.pause();
      }
    }
  }

我的问题是,当我点击主页按钮时,应用程序会在完成应用程序关闭动画后暂停音频(即当您在应用程序内按下主页按钮时获得的动画,您的应用程序会从各个方向缩小到中心并完全消失)。

这感觉很笨拙,因为动画完成后音频停止。有时它会在动画完成后停止 + 最多 1 秒过去。我在发布版本上对其进行了测试,结果相同。这太可怕了!问题是 Flutter 检测到 AppLifecycleState.paused 状态太晚了,不如原生快(实际上没有接近原生)。原生 Android 几乎在按下 home 键的那一刻就检测到它。当用户点击主页按钮时,是否有其他方法可以暂停和取消暂停 Flutter 中的音频播放器?对于生产就绪的应用程序来说,这是无法接受的。

我的颤振版本:1.22.0 稳定版

4

1 回答 1

1

不幸的是,目前没有办法立即对 Android 的onPause生命周期事件做出反应。这是由于 Flutter 引擎中运行的 Dart 代码与插件提供的原生平台代码之间的异步通信特性。每当 Dart 层中的代码通过“平台通道”向平台层发送消息时,它就会被添加到队列中并进行调度。从平台端到 Dart 端的响应消息同样被添加到队列中并被调度。有时有很多事情发生(例如,当您按下主页按钮时),事情会特别忙,您不会得到即时响应。然而,最近的一份文件来自 Flutter 团队的计划概述了在 Flutter 引擎和应该解决该问题的平台之间添加同步通信的计划。如果你想要这个功能,你可以将你的反馈直接添加到该文档中,以供 Flutter 团队查看。

同时,对 Android 的生命周期立即做出反应的唯一方法onPause是使用原生平台代码。例如,一个功能可以直接嵌入到您正在使用的插件中,以自动暂停播放器以响应onPause,并且它能够立即做出反应,因为生命周期事件将在平台端接收和处理,而无需旅行通过上面提到的异步平台通道。

于 2020-10-11T08:36:07.230 回答