Flutter for OpenHarmony 智能备忘录笔记APP 实战DAY7:笔记收藏功能+收藏状态持久化+收藏专属分类+列表收藏图标标识
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
大家好,继续Flutter鸿蒙智能备忘录实战连载DAY7!
DAY6我们完成了顶部搜索栏、关键词模糊检索、分类+搜索双重组合筛选,笔记查找能力已经完全成型。
今天DAY7重点新增笔记收藏核心功能,给每条笔记增加收藏状态、本地持久化存储、列表显示收藏图标、新增「收藏」专属分类筛选、支持一键收藏/取消收藏,完美升级备忘录收藏收藏夹管理能力。
🚀 本期开发目标
- 改造笔记Model实体类,新增收藏标识字段isStar
- 完善JSON序列化适配新增字段,保证兼容旧数据
- 改造笔记列表Item,右上角增加收藏星星图标
- 实现点击星星切换收藏/取消收藏状态
- 收藏状态写入本地存储,重启APP状态不丢失
- 顶部分类栏新增「收藏」分类,只筛选已收藏笔记
- 兼容原有搜索、分类、筛选逻辑,新增收藏功能互不冲突
📦 第一步:升级NoteModel新增收藏字段
打开note_model.dart,给实体类新增isStar布尔字段,用来标记是否收藏。
finalbool isStar;NoteModel({requiredthis.id,requiredthis.title,requiredthis.content,requiredthis.time,requiredthis.tag,this.isStar=false,});默认值设为false,兼容之前未带收藏字段的旧笔记数据,不会出现编译报错、空值异常。
🔄 第二步:同步更新fromJson与toJson
适配新增收藏字段,完成序列化和反序列化,保证存入本地、读取解析正常无误。
factoryNoteModel.fromJson(Map<String,dynamic>json){returnNoteModel(id:json['id'],title:json['title'],content:json['content'],time:json['time'],tag:json['tag'],isStar:json['isStar']??false,);}Map<String,dynamic>toJson(){return{'id':id,'title':title,'content':content,'time':time,'tag':tag,'isStar':isStar,};}读取时做空值兜底,老版本无收藏字段笔记自动默认未收藏,适配兼容平滑升级。
🏷️ 第三步:全局常量新增收藏分类
打开标签常量类,在分类列表最末尾加入「收藏」分类,和其他标签统一管理。
staticconstList<String>tagList=["全部","个人","工作","学习","生活","收藏"];自动适配顶部横向标签栏,无需额外修改UI代码,自动多出一栏收藏分类入口。
🧩 第四步:笔记卡片新增右上角收藏图标
修改自定义笔记Item卡片布局,在右上角添加星星图标,实心代表已收藏、空心代表未收藏。
Row(mainAxisAlignment:MainAxisAlignment.spaceBetween,children:[Expanded(child:Column(crossAxisAlignment:CrossAxisAlignment.start,children:[Text(note.title,style:TextStyle(fontSize:16,fontWeight:FontWeight.bold)),SizedBox(height:6),Text(note.content,maxLines:2,overflow:TextOverflow.ellipsis),],)),SizedBox(width:10),Icon(note.isStar?Icons.star:Icons.star_border,color:note.isStar?Colors.amber:Colors.grey,)],)黄色实心星星标识已收藏,灰色空心为未收藏,视觉区分明显,符合鸿蒙简约UI风格。
⭐ 第五步:点击图标切换收藏状态
给收藏图标添加点击事件,根据笔记ID找到对应条目,反转isStar状态,重新保存到本地。
voidtoggleStar(StringnoteId)async{List<NoteModel>list=StorageUtil.getNoteList();int index=list.indexWhere((e)=>e.id==noteId);if(index==-1)return;// 反转收藏状态list[index]=NoteModel(id:list[index].id,title:list[index].title,content:list[index].content,time:list[index].time,tag:list[index].tag,isStar:!list[index].isStar,);awaitStorageUtil.saveNoteList(list);// 刷新列表filterNoteByTagAndSearch();}状态反转后立即更新本地存储,并重新执行筛选刷新UI,点击即生效,无延迟。
🔍 第六步:改造筛选逻辑适配收藏分类
修改组合筛选方法,当选中「收藏」标签时,只过滤出isStar为true的笔记。
// 原有分类筛选逻辑基础上新增if(curSelectTag=="收藏"){tempList=originList.where((e)=>e.isStar==true).toList();}elseif(curSelectTag=="全部"){tempList=originList;}else{tempList=originList.where((e)=>e.tag==curSelectTag).toList();}逻辑分支清晰,收藏分类独立过滤,和普通标签分类互不干扰,同时兼容搜索关键词筛选。
✏️ 第七步:新增/编辑笔记兼容收藏字段
在新增和编辑笔记保存逻辑里,默认带入isStar状态,保持数据结构完整统一。
NoteModelnote=NoteModel(id:id,title:title,content:content,time:time,tag:selectTag,isStar:false,);新建笔记默认未收藏,后续可手动点击星星标记收藏,数据结构完整闭环。
✅ DAY7 真机运行实测效果
- 笔记实体成功升级收藏字段,兼容历史旧笔记数据无报错;
- 每条笔记右上角展示收藏星星图标,已收藏黄色高亮显示;
- 点击星星可一键切换收藏/取消收藏,状态即时生效;
- 收藏状态永久存入本地,退出重启APP仍保留收藏标记;
- 顶部分类栏多出「收藏」选项,点击只展示所有已收藏笔记;
- 收藏功能与原有分类、搜索、编辑、删除完全兼容,互不冲突;
- UI样式圆角、配色、布局完全适配OpenHarmony设计规范。
🎯 DAY7 知识点总结 & DAY8预告
本节核心知识点
- Flutter实体模型增量升级、新增字段兼容旧数据写法;
- Model序列化适配新增字段,空值兜底兼容方案;
- 列表自定义布局角标图标摆放、状态动态切换UI;
- 根据唯一ID定位条目、局部修改对象属性的实战技巧;
- 新增业务分类标签、扩展筛选逻辑,做到低侵入式迭代开发。
下一节DAY8预告
DAY8我们将开发:
- 笔记时间排序优化,最新笔记置顶展示
- 全局主题深浅色模式切换,适配鸿蒙系统深色模式
- 应用设置页面搭建,提供主题切换、数据清空入口
- 优化整体性能,列表滑动流畅度升级
- 冗余代码清理、项目结构进一步规整