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

Flutter中audioplayers.dart无法停止旧音频,多音频同时播放问题

解决Flutter多音频叠加播放问题

你的问题核心在于每次调用playSound都会创建新的AudioPlayer实例——你调用的player.stop()是针对刚创建的全新实例,根本没触碰到之前正在播放的那个实例,所以旧音频会继续播放,新音频又启动,最终导致叠加。

修复方案

把AudioPlayer实例提升为State类的成员变量,让所有按钮共享同一个播放器实例:

  1. 在State类中声明全局的AudioPlayer对象
  2. 每次播放新音频前,先调用这个全局实例的stop()方法
  3. 在组件销毁时释放播放器资源,避免内存泄漏

修改后的完整代码

class _MyAppState extends State<MyApp> {
  // 声明全局播放器实例
  late AudioPlayer _audioPlayer;

  @override
  void initState() {
    super.initState();
    // 初始化播放器
    _audioPlayer = AudioPlayer();
  }

  void playSound(int soundNumber) async {
    // 先停止当前正在播放的音频
    await _audioPlayer.stop();
    // 播放新音频
    await _audioPlayer.play(AssetSource('note$soundNumber.wav'));
  }

  @override
  void dispose() {
    // 组件销毁时释放播放器资源
    _audioPlayer.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: Column(
            children: [
              TextButton(
                onPressed: () {
                  playSound(1);
                },
                style: TextButton.styleFrom(backgroundColor: Colors.red),
                child: const Text("音频1")
              ),
              TextButton(
                onPressed: () {
                  playSound(2);
                },
                style: TextButton.styleFrom(backgroundColor: Colors.blue),
                child: const Text("音频2")
              ),
              // 其他按钮...
            ]
          )
        )
      )
    );
  }
}

关键说明

  • 使用late关键字延迟初始化播放器,在initState中完成实例创建,确保生命周期正确
  • 调用stop()和play()时加上await,保证操作顺序执行(先停再播)
  • 在dispose方法中调用_audioPlayer.dispose(),及时释放音频资源,避免内存占用

内容的提问来源于stack exchange,提问作者adnan shaikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:03:29