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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:35:38