如何在Flutter应用中使用本地存储实现收藏按钮功能及方案选型
Flutter语录应用收藏功能存储方案选型建议
需求匹配度前置判断
你当前需要存储的核心数据仅为「已收藏的页码集合」,属于结构简单、体量极小的非结构化数据,两种方案都可以实现,差异主要在学习成本和扩展性。
方案1:Shared Preferences
适用场景
适合仅需要实现当前两个核心需求、追求快速落地功能的情况
- 优势:
- 学习成本极低,无需掌握SQL语法、表结构设计,仅需调用简单的键值对读写API
- 集成和使用门槛极低,几行代码就能完成读写逻辑,新手半天就能跑通整个收藏功能
- 性能完全满足当前需求,哪怕存几百个收藏页码也不会有卡顿问题
- 简单读写示例:
// 写入收藏页码 final prefs = await SharedPreferences.getInstance(); await prefs.setStringList('fav_pages', favPageList.map((page) => page.toString()).toList()); // 读取收藏页码 final List<String>? storedFavs = prefs.getStringList('fav_pages'); final List<int> favPages = storedFavs?.map((str) => int.parse(str)).toList() ?? [];
- 劣势:
- 仅支持基础数据类型存储,无法直接存储结构化的复杂数据,如果后续要扩展收藏功能(比如存储语录内容、收藏时间、分类标签),需要完全重构存储逻辑
- 不支持条件查询、排序、批量修改等操作,数据量超过千条后读写性能会明显下降
方案2:SQLite
适用场景
适合想借练习项目积累更多技术经验、后续打算扩展APP功能的情况
- 优势:
- 支持结构化数据存储,后续给收藏功能加任意扩展字段都不需要重构存储层
- 支持条件查询、排序、批量增删改等操作,哪怕存储上万条收藏数据性能也十分稳定
- 可以掌握移动端关系型数据库的开发经验,对后续开发复杂Flutter项目有帮助
- 劣势:
- 学习成本更高,需要掌握基础SQL语法、表结构设计,要么手写SQL语句搭配
sqflite库使用,要么额外学习floor、drift等ORM库的使用 - 代码量是Shared Preferences方案的2-3倍,对于当前的最小需求来说属于过度设计
- 学习成本更高,需要掌握基础SQL语法、表结构设计,要么手写SQL语句搭配
最终选型建议
- 优先选 Shared Preferences:如果你只是想快速完成当前练习项目的核心需求,不需要额外扩展功能,这个方案是投入产出比最高的选择
- 可选 SQLite:如果你想借这个项目多掌握一项常用存储技术,后续还计划给语录APP加更多功能(比如收藏搜索、导出备份、语录备注),可以直接选SQLite一步到位
内容的提问来源于stack exchange,提问作者Arefin
相关产品推荐
相关产品推荐

