Flutter中使用audioplayers包同时播放音频与执行函数的问题
解决audioplayers同步播放音频与执行函数的问题
核心问题在于audioPlayer.play()本身包含资源加载的异步开销,直接用async/await或onCompleted无法做到严格同步。以下是两种可靠的解决方案:
1. 预加载音频+Future.wait同步触发
提前加载音频资源消除播放时的加载延迟,再用Future.wait让播放和目标函数同时启动:
import 'package:audioplayers/audioplayers.dart'; late AudioPlayer audioPlayer; final audioCache = AudioCache(); // 初始化时预加载音频 @override void initState() { super.initState(); audioPlayer = AudioPlayer(); // 预加载目标音频,放在initState或页面初始化阶段 audioCache.load('assets/audio/your_audio.mp3'); } // 同步执行的核心方法 Future<void> startBothActions() async { // 确保音频已完成预加载 await audioCache.load('assets/audio/your_audio.mp3'); // 同时触发音频播放和目标函数 await Future.wait([ audioPlayer.play(AssetSource('assets/audio/your_audio.mp3')), yourSecondFunction(), // 你的第二个函数 ]); } void yourSecondFunction() { // 这里是需要同步执行的逻辑 }
2. 监听播放器就绪事件同步启动
利用onPlayerReady回调,在播放器完全准备好播放的瞬间,同时启动播放和目标函数:
import 'package:audioplayers/audioplayers.dart'; late AudioPlayer audioPlayer; @override void initState() { super.initState(); audioPlayer = AudioPlayer(); } void startBothActions() { // 设置音频源 audioPlayer.setSource(AssetSource('assets/audio/your_audio.mp3')); // 监听播放器就绪状态 audioPlayer.onPlayerReady.listen((_) { // 此时播放器已完全准备好,无延迟启动两个操作 audioPlayer.play(); yourSecondFunction(); }); } void yourSecondFunction() { // 你的同步逻辑 }
为什么之前的方法无效?
async/await audioPlayer.play():play()的await等待的是“播放请求已发送”的信号,而非音频实际开始播放,此时资源可能还在加载,导致函数先执行、音频延迟播放。onCompleted回调:这是播放结束后触发的回调,完全不符合“同步启动”的需求。
额外注意事项
- 确保音频资源路径正确,Android/iOS的资源配置无误(比如Android的assets目录、iOS的Bundle资源)。
- 预加载大音频会占用内存,若音频文件较大,可按需预加载或在使用前提前几秒加载。
内容的提问来源于stack exchange,提问作者Kamil Żebrowski
相关产品推荐
相关产品推荐

