Flutter中audioplayers.dart无法停止旧音频,多音频同时播放问题
解决Flutter多音频叠加播放问题
你的问题核心在于每次调用playSound都会创建新的AudioPlayer实例——你调用的player.stop()是针对刚创建的全新实例,根本没触碰到之前正在播放的那个实例,所以旧音频会继续播放,新音频又启动,最终导致叠加。
修复方案
把AudioPlayer实例提升为State类的成员变量,让所有按钮共享同一个播放器实例:
- 在State类中声明全局的
AudioPlayer对象 - 每次播放新音频前,先调用这个全局实例的
stop()方法 - 在组件销毁时释放播放器资源,避免内存泄漏
修改后的完整代码
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
相关产品推荐
相关产品推荐

