You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用assets_audio_player播放背景音乐跳转页面时如何停止播放

问题修复方案

1. 核心问题说明

你当前代码的核心问题是播放器实例引用错误:
你同时创建了两个完全独立的播放器实例:

  • 实例1:赋值给_assetsAudioPlayer变量的对象,仅调用了play方法但未加载任何音频资源
  • 实例2:通过AssetsAudioPlayer.newPlayer()创建的匿名实例,实际加载了音频并播放,但你没有持有这个实例的引用,后续无法控制它停止

2. 完整修改步骤

第一步:统一播放器实例

修改initState中的初始化逻辑,所有播放操作都使用同一个你持有的实例:

@override
void initState() {
  super.initState();
  // 仅初始化一个播放器实例,全程持有引用
  _assetsAudioPlayer = AssetsAudioPlayer.newPlayer();
  _assetsAudioPlayer!.open(
    Audio("assets/audio/bgm.mp3"),
    autoStart: true,
    showNotification: true,
  );
}

第二步:跳转前主动停止播放

在触发页面跳转的手势点击事件中,先停止播放再执行跳转逻辑:

onTap: () async {
  // 跳转前先停止当前播放的音频
  await _assetsAudioPlayer?.stop();
  if(mounted) {
    Navigator.pushReplacement(
      context,
      MaterialPageRoute(builder: (context) => ContentScreen()),
    );
  }
},

第三步:销毁页面时释放播放器资源

修改dispose生命周期方法,先释放播放器资源再置空变量:

@override
void dispose() { 
  _assetsAudioPlayer?.dispose(); // 释放播放器占用的所有资源
  _assetsAudioPlayer = null;
  super.dispose();
}

3. 补充说明

  • 如果需要实现返回当前页面时恢复播放,可以把stop方法换成pause,回到页面后再调用play即可
  • 如果你有多个跳转入口,每个跳转的点击逻辑都要加上停止播放的逻辑,或者仅在dispose里处理即可,因为pushReplacement会触发当前页面的dispose生命周期

内容的提问来源于stack exchange,提问作者api test

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:27:02