Flutter for OpenHarmony 智能备忘录笔记APP 实战DAY4:笔记详情编辑+内容覆盖保存+长按弹窗删除+数据实时同步

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

大家好,继续Flutter鸿蒙智能备忘录实战连载DAY4!
DAY1搭建项目基础架构与存储工具,DAY2完成笔记模型与列表卡片渲染,DAY3实现新建笔记、本地持久化存储与页面跳转闭环。
今天DAY4攻坚笔记核心运维能力,完整实现笔记条目点击跳转详情编辑页、修改内容覆盖原笔记保存、长按唤起删除确认弹窗、删除数据同步清空本地缓存、全局状态实时刷新列表,完成笔记增、改、删全套基础业务,功能趋近完整可用,全程延续统一文风、排版、代码体量、结构格式,无缝衔接往期内容。

🚀 本期开发目标

  1. 新建笔记详情编辑页面,复用输入组件,兼容查看与编辑双模式
  2. 实现列表条目点击传参,把选中笔记完整数据带入编辑页
  3. 编写笔记修改逻辑,编辑完成覆盖原数据,本地缓存同步更新
  4. 封装全局通用确认弹窗工具,复用删除、二次确认类交互场景
  5. 实现笔记长按监听,弹出删除确认弹窗,防止误操作
  6. 完成删除业务逻辑,移除对应笔记、更新本地存储、即时刷新首页
  7. 完善操作交互反馈,优化页面关闭、数据重载全流程体验

📄 第一步:创建笔记详情编辑复用页面

在ui/page目录新建note_edit_page.dart,复用新增笔记的输入布局,一套页面同时支持查看旧笔记、编辑修改笔记两种场景,减少冗余代码。

class NoteEditPage extends StatefulWidget {
  final NoteModel note;
  const NoteEditPage({super.key,required this.note});
}

通过构造函数接收外部传入的完整笔记对象,承接首页点击传递的数据,实现页面间参数通信,结构清晰解耦。

✏️ 第二步:编辑页回显原有笔记数据

页面初始化时,把传入笔记的标题、内容赋值给输入控制器,进入页面自动回填历史内容,直接修改即可,无需手动重写。


void initState() {
  super.initState();
  _titleCtrl.text = widget.note.title;
  _contentCtrl.text = widget.note.content;
}

依托生命周期初始化赋值,适配鸿蒙页面栈管理机制,跳转流畅不卡顿,数据回显零延迟。

💾 第三步:实现笔记修改覆盖保存逻辑

复用存储工具读写方法,根据笔记唯一ID匹配目标条目,修改字段后整体覆盖更新,保证本地数据和编辑后内容完全一致。

void updateNote() async {
  String newTitle = _titleCtrl.text.trim();
  String newContent = _contentCtrl.text.trim();
  if(newTitle.isEmpty) return;

  List<NoteModel> list = StorageUtil.getNoteList();
  int index = list.indexWhere((e) => e.id == widget.note.id);
  if(index == -1) return;

  list[index] = NoteModel(
    id: widget.note.id,
    title: newTitle,
    content: newContent,
    time: DateFormat("yyyy-MM-dd").format(DateTime.now()),
    tag: widget.note.tag,
  );
  await StorageUtil.saveNoteList(list);
  Navigator.pop(context);
}

按ID精准定位目标笔记,保留原有ID与标签,仅更新标题、正文与修改时间,修改痕迹清晰,业务逻辑严谨规范。

🔔 第四步:封装全局通用确认弹窗

抽取公共弹窗组件,后续删除、清空、退出等二次确认场景直接复用,统一UI样式,贴合鸿蒙系统弹窗交互风格。
在这里插入图片描述

showCommonDialog(BuildContext context,String msg,VoidCallback onConfirm){
  showDialog(context: context,builder: (_){
    return AlertDialog(
      title: Text("操作确认"),
      content: Text(msg),
      actions: [
        TextButton(onPressed: ()=>Navigator.pop(context),child: Text("取消")),
        TextButton(onPressed: onConfirm,child: Text("确定")),
      ],
    );
  });
}

通用封装无需重复编写弹窗代码,一处定义全局调用,精简代码量,统一交互规范。

❌ 第五步:绑定列表长按删除监听

改造笔记列表Item组件,新增长按手势监听,长按任意笔记卡片唤起删除确认弹窗,区分点击编辑、长按删除两种手势行为,互不冲突。
在这里插入图片描述

InkWell(
  onTap: ()=>RouteUtil.push(context,NoteEditPage(note: note)),
  onLongPress: ()=>showCommonDialog(context,"确定删除这条笔记吗?",()=>deleteNote(note.id)),
  child: 原有笔记卡片布局,
)

单击进入编辑、长按触发删除,符合移动端用户通用操作习惯,交互逻辑直观易懂。

🗑️ 第六步:编写笔记删除核心业务

根据笔记ID过滤移除目标数据,更新本地缓存,关闭弹窗后自动刷新首页列表,实现删除操作全流程闭环。

void deleteNote(String targetId) async {
  List<NoteModel> list = StorageUtil.getNoteList();
  list.removeWhere((e) => e.id == targetId);
  await StorageUtil.saveNoteList(list);
  Navigator.pop(context);
  loadNoteData();
}

使用removeWhere精准批量过滤删除,代码简洁高效,操作后同步刷新本地存储与页面UI,无数据残留、无界面卡顿。

🔄 第七步:统一全局数据刷新机制

优化首页数据加载方法,编辑修改、删除操作返回首页,统一重载本地缓存数据,保证全页面数据状态一致,杜绝数据不同步问题。

void loadNoteData(){
  setState(() {
    noteList = StorageUtil.getNoteList();
  });
}

所有增删改操作最终统一调用该方法刷新UI,状态管理规整,后期拓展功能无需改动原有刷新逻辑。

✅ DAY4 真机运行实测效果

  1. 点击笔记条目正常跳转详情编辑页,原有标题内容自动完整回显;
  2. 修改文字后点击保存,原笔记内容覆盖更新,修改时间同步刷新;
  3. 长按笔记卡片精准唤起删除确认弹窗,避免误删操作;
  4. 确认删除后笔记即刻消失,本地缓存同步清理,数据彻底移除;
  5. 所有操作返回首页自动刷新,列表数据实时同步,状态统一;
  6. 全流程交互流畅,弹窗样式、页面布局深度适配OpenHarmony视觉规范。

🎯 DAY4 知识点总结 & DAY5预告

本节核心知识点

  1. Flutter页面传参方案、复用式页面搭建与双向业务场景适配;
  2. 根据唯一ID匹配定位数据,实现本地数据修改覆盖更新;
  3. 全局通用弹窗组件封装,实现交互组件复用、统一UI规范;
  4. 点击/长按多手势区分监听,实现不同操作逻辑互不干扰;
  5. 本地数据过滤删除、缓存同步、页面联动刷新完整业务闭环。

下一节DAY5预告

DAY5我们将开发:

  • 实现笔记分类标签选择功能,新增编辑页可选分类
  • 按标签分类筛选笔记,搭建分类筛选顶部导航栏
  • 优化空数据页面,无笔记时展示空白占位提示页
  • 完善全局异常兜底,兼容各类空数据、异常场景
  • 优化整体动效过渡,提升APP细腻交互质感

更多推荐