使用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
相关产品推荐
相关产品推荐

