检测到 Flutter onResume 太迟无法暂停音乐

Flutter onResume is detected too late for music pausing

我有以下代码,我使用 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 几乎在按下主页键的那一刻就检测到它。当用户按下主页按钮时,还有其他方法可以暂停和取消暂停 Flutter 中的音频播放器吗?这对于生产就绪的应用程序来说是不可接受的。

我的 flutter 版本: 1.22.0 稳定

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

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