Flutter用audioplayers播放资源音频遇setDataSource failed错误求助
解决Flutter audioplayers播放assets音频的setDataSource错误
核心问题定位
你代码里的关键错误是用错了资源加载类型:DeviceFileSource是用来读取设备本地文件系统里的文件,而assets目录下的资源是打包进应用的内嵌资源,必须用AssetSource来加载。
修正后的代码
替换Source类型,同时优化AudioPlayer的生命周期(避免每次点击都创建新实例,减少资源浪费):
import 'package:flutter/material.dart'; import 'package:audioplayers/audioplayers.dart'; void main() { runApp(const Xylophone()); } class Xylophone extends StatefulWidget { const Xylophone({super.key}); @override State<Xylophone> createState() => _XylophoneState(); } class _XylophoneState extends State<Xylophone> { // 提前初始化播放器,复用实例 final AudioPlayer _player = AudioPlayer(); @override void dispose() { // 页面销毁时释放播放器资源 _player.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: SafeArea( child: TextButton( onPressed: () async { try { await _player.play( AssetSource('note1.wav'), // 改用AssetSource加载assets资源 ); } catch (e) { print('播放出错: $e'); } }, child: const Text('点击播放'), ), ), ), ); } }
额外排查项
如果替换后还是报错,按以下顺序检查:
- 确认pubspec.yaml的assets配置:必须正确声明资源路径,格式如下(注意用空格缩进,不能用tab):
修改后执行flutter: assets: - assets/note1.wav # 如果assets下有多个文件,也可以直接写 - assets/flutter pub get生效。 - 检查音频文件完整性:确保
note1.wav是标准可播放的WAV文件,可替换一个已知正常的音频测试。 - 清理缓存重启:执行
flutter clean,然后重启IDE和设备,避免缓存导致的资源加载异常。 - Android权限检查:虽然播放assets资源不需要存储权限,但如果之前误配置了权限,可检查
android/app/src/main/AndroidManifest.xml,移除多余的权限声明。
内容的提问来源于stack exchange,提问作者Parul Pandey
相关产品推荐
相关产品推荐

