Dart:如何让单例AudioService同时播放点击音效与循环音乐?
解决audioplayers同时播放背景音乐与点击音效的问题
问题根源在于你当前共用了一个AudioPlayer实例,当调用play方法时,新的音频会中断正在播放的音频。要实现同时播放,需要为背景音乐和点击音效分别创建独立的AudioPlayer实例。
修改后的完整代码如下:
import 'package:audioplayers/audioplayers.dart'; import 'package:biblequiz/services/preferences.dart'; class AudioService { // 分别为背景音乐和点击音效创建独立播放器 final AudioPlayer _bgmPlayer = AudioPlayer(); final AudioPlayer _clickPlayer = AudioPlayer(); static final AudioService instance = AudioService._(); AudioService._() { // 初始化音量 _bgmPlayer.setVolume(1.0); _clickPlayer.setVolume(1.0); } void clickSound() async { // 使用点击音效专用播放器 await _clickPlayer.play(AssetSource('sounds/click.mp3')); } void loopSound() async { // 设置背景音乐播放器为循环模式并播放 _bgmPlayer.setReleaseMode(ReleaseMode.loop); await _bgmPlayer.play(AssetSource('sounds/music.wav')); } void stopLoop() async { // 停止背景音乐播放器 await _bgmPlayer.stop(); } // 可选:添加释放资源的方法,避免内存泄漏 void dispose() async { await _bgmPlayer.dispose(); await _clickPlayer.dispose(); } }
核心改动说明:
- 新增
_bgmPlayer和_clickPlayer两个独立的AudioPlayer实例,分别负责背景音乐和点击音效的播放 - 各个方法对应使用专属的播放器:
loopSound和stopLoop用_bgmPlayer,clickSound用_clickPlayer - 可选添加
dispose方法,在应用退出或不再需要音频服务时释放播放器资源,防止内存泄漏
这样修改后,背景音乐循环播放时,点击音效可以正常触发,两者不会互相中断。
内容的提问来源于stack exchange,提问作者Teknoville
相关产品推荐
相关产品推荐

