Flutter无需Firebase等数据库实现本地习题收藏功能的方法
Flutter本地持久化收藏功能实现方案
可行性结论
无需使用Firebase或其他外部数据库,仅靠Flutter生态的本地存储能力即可完全实现需求,针对数百道习题的量级,性能完全够用。
推荐存储方案
优先使用shared_preferences实现,该方案是Flutter官方维护的轻量级本地键值对存储组件,适配全平台,配置成本极低,适合存储习题ID集合这类简单数据。如果后续需要存储更复杂的习题结构化数据,也可以切换为Hive这类轻量级NoSQL本地数据库。
具体实现步骤
- 引入依赖
在pubspec.yaml的dependencies节点下添加:
shared_preferences: ^2.2.2
添加后执行flutter pub get完成依赖安装。
- 封装收藏数据读写工具方法
import 'package:shared_preferences/shared_preferences.dart'; // 存储收藏的习题ID列表 Future<void> saveFavoriteList(List<String> favoriteIds) async { final prefs = await SharedPreferences.getInstance(); await prefs.setStringList('exercise_favorites', favoriteIds); } // 获取已收藏的习题ID列表 Future<List<String>> getFavoriteList() async { final prefs = await SharedPreferences.getInstance(); return prefs.getStringList('exercise_favorites') ?? []; }
- 修改现有页面代码
首先在State类中定义两个变量:
// 当前习题的唯一ID,示例中为'1-1' String currentExerciseId = '1-1'; // 当前习题的收藏状态 bool isFavorite = false;
然后在initState生命周期中初始化状态:
@override void initState() { super.initState(); _loadFavoriteStatus(); } Future<void> _loadFavoriteStatus() async { List<String> favorites = await getFavoriteList(); setState(() { isFavorite = favorites.contains(currentExerciseId); }); }
最后替换你标注//here位置的onPressed逻辑:
IconButton( icon: Icon( isFavorite ? Icons.bookmark : Icons.bookmark_outline, color: isFavorite ? Colors.blueAccent : Colors.black, ), iconSize: 25, onPressed: () async { List<String> favorites = await getFavoriteList(); if (isFavorite) { // 已收藏则移除 favorites.remove(currentExerciseId); } else { // 未收藏则添加 favorites.add(currentExerciseId); } await saveFavoriteList(favorites); setState(() { isFavorite = !isFavorite; }); } )
补充说明
如果需要在习题选择页展示收藏状态,只需要在该页初始化时调用getFavoriteList()方法获取所有已收藏的ID,遍历习题列表匹配ID即可展示对应收藏标记。
内容的提问来源于stack exchange,提问作者eno2
相关产品推荐
相关产品推荐

