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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:15:36