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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:45:02