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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:15:13