Flutter中存储音乐及播放进度应选用哪种本地存储方案
Flutter本地存储选型方案
你的两类需求对应大体积二进制文件持久化和轻量键值对数据持久化两种完全不同的存储场景,没必要硬找单个Package覆盖所有需求,用Flutter官方维护的两个轻量包组合实现是最稳、踩坑最少的选择,犯不上为了少加一个依赖去用维护状态不明的第三方封装包。
- 音乐文件存储用
path_provider
这是官方维护的跨平台路径获取工具,能直接适配Android、iOS的应用专属沙盒目录:
存文件一定要用getApplicationDocumentsDirectory()拿到的持久化目录,别用临时缓存目录——临时目录会在系统存储空间不足时被自动清理,用户下好的歌莫名其妙消失是非常差的体验。
存在应用专属目录不需要额外申请存储权限(Android 13+、iOS全版本都支持),省了很多权限兼容的麻烦。你只需要在这个目录下建个专门存音乐的子文件夹,下载的音频直接用YouTube视频ID当文件名存就行,后续本地播放直接拼路径传给播放器就能读取,不用额外维护文件路径的映射表。 - 播放进度存储用
shared_preferences
同样是官方维护的轻量KV存储工具,专门用来存这类小体积的状态、配置数据:
你只要以play_progress_ + YouTube视频ID当键,每次用户暂停、切歌、退应用的时候,把当前播放位置的毫秒值存进去就行。下次用户点开同一首歌,先把这个值读出来,等播放器初始化完直接调用seek接口跳转到对应时间点,就实现断点续播了。
这类数据单条就是个整数值,就算存上千首歌的进度总大小也不到10KB,完全没必要上SQLite、Hive这类本地数据库,纯纯给自己加没必要的代码量和包体积。
避坑提醒:别碰那种号称“一站式搞定所有本地存储”的小众第三方包,这类包大多更新不及时,很容易在新系统版本上出兼容bug。两个官方包加起来的集成代码不到20行,稳定性比第三方封装高得多。
最简实现参考:
// 初始化本地音乐存储目录 final appDocDir = await getApplicationDocumentsDirectory(); final musicDir = Directory('${appDocDir.path}/local_musics'); if (!await musicDir.exists()) { await musicDir.create(recursive: true); } // 播放进度读写逻辑 final prefs = await SharedPreferences.getInstance(); // 暂停/退出时保存进度 await prefs.setInt('play_progress_$videoId', currentPosition.inMilliseconds); // 播放初始化时读取进度续播 final lastPlayMs = prefs.getInt('play_progress_$videoId') ?? 0; await player.seek(Duration(milliseconds: lastPlayMs));
内容的提问来源于stack exchange,提问作者Mohamed Gamal Mohamed
相关产品推荐
相关产品推荐

