Flutter中修改Bookmark值并保存至安全存储的实现方法
解决方法
要实现修改Resources的bookmark值并保存到Flutter Secure Storage,按以下步骤操作即可:
1. 给模型补充toJson方法
因为需要把修改后的Lessons列表转成JSON格式才能存储,所以给两个模型分别实现toJson方法:
class Lessons { final int? id; final String? title; final List<Resources> resources; Lessons({ required this.id, required this.title, required this.resources, }); // 新增:转JSON方法 Map<String, dynamic> toJson() { return { 'id': id, 'title': title, 'resources': resources.map((res) => res.toJson()).toList(), }; } // 补全fromJson(如果之前没写的话) factory Lessons.fromJson(Map<String, dynamic> json) { return Lessons( id: json['id'], title: json['title'], resources: List<Resources>.from(json['resources'].map((x) => Resources.fromJson(x))), ); } } class Resources extends Equatable { final int? id; final String? question; final String? answer; bool? bookmark; Resources({ required this.id, required this.question, required this.answer, required this.bookmark, }); // 新增:转JSON方法 Map<String, dynamic> toJson() { return { 'id': id, 'question': question, 'answer': answer, 'bookmark': bookmark, }; } // 补全fromJson(如果之前没写的话) factory Resources.fromJson(Map<String, dynamic> json) { return Resources( id: json['id'], question: json['question'], answer: json['answer'], bookmark: json['bookmark'], ); } // 重写props,包含bookmark(Equatable需要) @override List<Object?> get props => [id, question, answer, bookmark]; }
2. 实现修改并保存的逻辑
在你的存储工具类里,新增一个方法用来切换指定资源的bookmark,之后把整个列表重新保存:
// 假设你已经有全局的lessonsList变量,或者可以传参进来 static Future<void> toggleResourceBookmark(int lessonId, int resourceId) async { // 1. 定位目标课程 final targetLesson = lessonsList.firstWhere((lesson) => lesson.id == lessonId); // 2. 定位目标资源 final targetResource = targetLesson.resources.firstWhere((res) => res.id == resourceId); // 3. 切换bookmark状态 targetResource.bookmark = !(targetResource.bookmark ?? false); // 4. 组装成符合存储格式的JSON结构 final saveData = { 'lessons': lessonsList.map((lesson) => lesson.toJson()).toList(), }; // 5. 调用已有的存储方法保存 await setLessonData(saveData); }
3. 在UI中调用方法
在需要切换书签的交互处(比如按钮点击),直接调用这个方法即可:
onTap: () async { await YourStorageClass.toggleResourceBookmark(lesson.id!, resource.id!); // 这里刷新UI,比如调用setState或者通知状态管理工具更新 },
额外提醒
- 如果用了状态管理(Provider、Riverpod等),修改bookmark后要触发状态更新,保证UI同步变化。
firstWhere找不到对应数据会报错,建议用firstWhereOrNull(需导入collection包)处理异常情况:final targetLesson = lessonsList.firstWhereOrNull((lesson) => lesson.id == lessonId); if (targetLesson == null) return;
内容的提问来源于stack exchange,提问作者Saman Kc
相关产品推荐
相关产品推荐

