使用Flutter audioplayers:^2.0.0遇资源加载错误,求解决方案
解决audioplayers 2.0.0加载音频资产的异常问题
你遇到的这个异常,核心原因是混淆了AudioCache加载后的本地缓存路径和setSourceAsset的使用场景——setSourceAsset是用来加载打包在App里的原始资产文件的,而AudioCache.load()返回的是缓存到本地的文件路径,不能用setSourceAsset来加载它。
下面给你两种可行的解决方案:
方案一:继续使用AudioCache预加载,播放缓存文件
既然你用了AudioCache预加载音频,那应该用setSourceUrl来播放本地缓存的文件,而不是setSourceAsset:
Future setAudio() async { AudioPlayer audioPlayer = AudioPlayer(); audioPlayer.setReleaseMode(ReleaseMode.loop); AudioCache audioCache = AudioCache(prefix: 'assets/audio/'); final url = await audioCache.load('flip.mp3'); // 改用setSourceUrl加载本地缓存文件路径 await audioPlayer.setSourceUrl(url.path); // 别忘了调用play方法开始播放 await audioPlayer.play(); }
方案二:直接加载原始资产,无需AudioCache
如果你不需要预加载缓存的话,可以直接用setSourceAsset加载pubspec中配置的原始音频文件,这样更简单:
Future setAudio() async { AudioPlayer audioPlayer = AudioPlayer(); audioPlayer.setReleaseMode(ReleaseMode.loop); // 直接传入资产路径,对应pubspec中配置的assets/audio/下的文件 await audioPlayer.setSourceAsset('assets/audio/flip.mp3'); await audioPlayer.play(); }
额外检查事项
- 确认pubspec.yaml的缩进正确:Flutter对YAML文件的缩进要求严格,
assets必须是flutter:下的子项,缩进2个空格,像你现在的配置是对的,但要确保没有用tab代替空格。 - 检查文件路径和大小写:确保项目中确实存在
assets/audio/flip.mp3文件,文件名大小写要完全匹配(比如iOS系统对文件名大小写敏感,Flip.mp3和flip.mp3会被视为不同文件)。 - 异步操作要加await:所有
setSourceXXX和play方法都是异步的,必须用await等待完成,避免出现未处理的异步异常。
内容的提问来源于stack exchange,提问作者Janhwa
相关产品推荐
相关产品推荐

