使用flutter_audio_query后Flutter应用无法获取歌曲文件问题求助
问题原因及修复方案
1. 状态更新逻辑缺失
你在异步方法getAllSongs中完成歌曲列表赋值后,没有调用setState()触发UI重建,StatefulWidget仅在收到setState通知时才会重新执行build逻辑,因此页面始终渲染初始的空列表。
修复代码:
Future<void> getAllSongs() async { songs = await audioQuery.getSongs(); setState(() {}); // 新增该行触发UI更新 }
2. 存储权限未配置和申请
flutter_audio_query需要读取设备本地媒体存储权限才能获取歌曲数据,缺少权限会导致getSongs()始终返回空列表:
- 安卓端配置:在
android/app/src/main/AndroidManifest.xml的manifest标签下添加权限声明<!-- 安卓12及以下版本权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 安卓13及以上版本权限 --> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> - iOS端配置:在
ios/Runner/Info.plist的dict标签下添加权限说明<key>NSAppleMusicUsageDescription</key> <string>需要访问媒体库读取歌曲文件</string>
完成配置后,需要在调用getAllSongs()前,通过权限申请类库动态申请对应权限,确认用户授权后再执行歌曲查询逻辑。
3. 专辑封面加载方法错误
songs[index].albumArtwork返回的是设备本地图片的文件路径,并非项目内置的asset资源,使用Image.asset加载会抛出资源不存在异常,需要改为Image.file加载:
// 需先导入dart:io库 leading: songs[index].albumArtwork != null ? Image.file(File(songs[index].albumArtwork), width: 50, height: 50, fit: BoxFit.cover) : Image.asset("assets/placeholder.png", width: 50, height: 50, fit: BoxFit.cover),
内容的提问来源于stack exchange,提问作者wale kuye
相关产品推荐
相关产品推荐

