Flutter-OH 鸿蒙工具类应用实战 Day4:Note 记事本笔记编辑与删除功能实现
编辑器支持传入旧笔记内容,可编辑修改首页列表单击编辑、长按删除删除带确认弹窗,防止误删编辑、删除后自动刷新列表 + 保存到本地完全不丢数据,适配鸿蒙模拟器正常运行。
欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net
一、使用软件
DevEco Studio
鸿蒙官方集成开发环境,提供项目管理、代码编辑、模拟器调试、应用打包等全流程开发能力,是 Flutter-OH 应用开发的核心工具。

Flutter-OH SDK
面向 OpenHarmony 生态定制的 Flutter 跨平台开发工具包,支持 Dart 语言编译、鸿蒙平台适配、UI 组件渲染与应用构建
OpenHarmony 模拟器
DevEco Studio 内置的鸿蒙设备虚拟运行环境,无需物理真机即可完成 APP 界面预览、功能调试与兼容性验证。
二、核心内容
实现笔记编辑修改、删除确认、列表状态同步与数据持久化更新,完善记事本应用的核心 CRUD 能力
三、操作步骤
步骤 1:修改 markdown_edit_page.dart
打开 lib/pages/markdown_edit_page.dart
粘贴下面完整代码
import 'package:flutter/material.dart';
class MarkdownEditPage extends StatefulWidget {
// 新增:接收传入的旧笔记内容
final String? initialContent;
const MarkdownEditPage({super.key, this.initialContent});
@override
State<MarkdownEditPage> createState() => _MarkdownEditPageState();
}
class _MarkdownEditPageState extends State<MarkdownEditPage> {
late TextEditingController _controller;
int _wordCount = 0;
@override
void initState() {
super.initState();
// 有旧内容就回填,没有就空
_controller = TextEditingController(text: widget.initialContent ?? "");
_wordCount = _controller.text.length;
// 监听输入,实时统计字数
_controller.addListener(() {
setState(() => _wordCount = _controller.text.length);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("编辑笔记"),
centerTitle: true,
actions: [
// 实时字数
Padding(
padding: const EdgeInsets.only(right: 16),
child: Text("字数:$_wordCount"),
),
// 保存按钮
IconButton(
icon: const Icon(Icons.check),
onPressed: () {
// 返回编辑后的内容给首页
Navigator.pop(context, _controller.text);
},
)
],
),
body: SafeArea(
child: Column(
children: [
Expanded(
child: Container(
padding: const EdgeInsets.all(12),
color: Colors.grey[100],
child: TextField(
controller: _controller,
maxLines: null,
autofocus: true,
decoration: const InputDecoration(
hintText: "请输入笔记内容...",
border: InputBorder.none,
),
),
),
),
const Divider(),
Expanded(
child: SingleChildScrollView(
padding: const EdgeInsets.all(12),
child: Text(
_controller.text.isEmpty ? "预览区域" : _controller.text,
style: TextStyle(fontSize: 16),
),
),
)
],
),
),
);
}
}
步骤 2:替换 main.dart 完整代码
打开 lib/main.dart
粘贴下面代码
import 'package:flutter/material.dart';
import 'utils/note_storage.dart';
import 'pages/markdown_edit_page.dart';
void main() {
runApp(const NoteApp());
}
class NoteApp extends StatelessWidget {
const NoteApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Note App',
debugShowCheckedModeBanner: false,
theme: ThemeData(primarySwatch: Colors.blue),
home: const HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
List<String> _notes = [];
// 页面初始化:读取本地笔记
@override
void initState() {
super.initState();
_loadNotes();
}
// 读取本地存储
Future<void> _loadNotes() async {
final list = await NoteStorage.loadNotes();
setState(() {
_notes = list;
});
}
// 保存笔记到本地
Future<void> _saveNotes() async {
await NoteStorage.saveNotes(_notes);
}
// 点击笔记:进入编辑页面
Future<void> _goEdit(int index) async {
// 跳转编辑页,并把当前笔记内容传过去
final result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MarkdownEditPage(
initialContent: _notes[index],
),
),
);
// 编辑有返回内容,就更新列表并保存
if (result != null) {
setState(() {
_notes[index] = result;
});
await _saveNotes();
}
}
// 长按笔记:弹出删除确认框
Future<void> _goDelete(int index) async {
bool? confirm = await showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text("确认删除"),
content: const Text("确定要删除这条笔记吗?"),
actions: [
TextButton(
onPressed: () => Navigator.pop(context, false),
child: const Text("取消"),
),
TextButton(
onPressed: () => Navigator.pop(context, true),
child: const Text("删除", style: TextStyle(color: Colors.red)),
),
],
),
);
if (confirm == true) {
setState(() {
_notes.removeAt(index);
});
await _saveNotes();
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("鸿蒙 Note 记事本")),
body: _notes.isEmpty
? const Center(
child: Text(
"暂无笔记,请点击新增\n创建你的第一条 Note",
textAlign: TextAlign.center,
style: TextStyle(color: Colors.grey),
),
)
: ListView.builder(
itemCount: _notes.length,
itemBuilder: (context, index) => ListTile(
title: Text(_notes[index]),
// 单击:编辑
onTap: () => _goEdit(index),
// 长按:删除
onLongPress: () => _goDelete(index),
trailing: const Icon(Icons.edit),
),
),
// 新增笔记按钮
floatingActionButton: FloatingActionButton(
onPressed: () async {
final newText = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => const MarkdownEditPage()),
);
if (newText != null) {
setState(() {
_notes.add(newText);
});
await _saveNotes();
}
},
child: const Icon(Icons.add),
),
);
}
}
步骤 3:运行测试功能
启动模拟器运行项目
-
测试功能:
- 点右下角加号 → 写内容 → 点右上角对勾保存,出现在列表

- 单击某条笔记 → 进入编辑,改完保存自动更新

- 长按某条笔记 → 弹出确认框,可删除

- 关闭 APP 重新打开,笔记还在(持久化生效)
- 点右下角加号 → 写内容 → 点右上角对勾保存,出现在列表
四、Day4 功能总结
- 编辑器支持传入旧笔记内容,可编辑修改
- 首页列表单击编辑、长按删除
- 删除带确认弹窗,防止误删
- 编辑、删除后自动刷新列表 + 保存到本地
- 完全不丢数据,适配鸿蒙模拟器正常运行
五、小结---Flutter-OH 鸿蒙工具类应用实战 Day4:Note 记事本笔记编辑与删除功能实现
工具类应用的核心竞争力,不仅在于数据存储,更在于数据的可编辑性与管理效率。对于记事本应用而言,笔记的修改与删除是高频刚需功能,直接影响用户体验与产品实用性。本篇基于前序搭建的 Flutter-OH 项目,为鸿蒙 Note 记事本补充笔记编辑、删除与列表刷新功能,完善数据全生命周期管理流程,实现从创建、查看、编辑到删除的完整闭环。
开发中,首先为笔记列表项增加交互入口:点击笔记进入编辑页面,支持修改文本内容并保存更新;长按笔记弹出删除确认对话框,防止误操作。编辑页面复用 Day3 的 Markdown 编辑器组件,同时增加数据回传逻辑,将修改后的内容同步更新到本地存储与列表界面,实现编辑后即时生效。删除功能则采用二次确认机制,用户点击删除按钮后,系统弹出提示框确认操作,避免误删重要笔记,删除成功后自动刷新列表并更新持久化数据。
为确保数据一致性,优化了状态管理逻辑:笔记修改或删除后,通过状态刷新更新列表视图,同时同步调用存储工具类更新本地数据,保障应用重启后数据状态与用户操作一致。针对 OpenHarmony 平台特性,优化了列表项点击反馈、对话框样式与动画效果,使其贴合鸿蒙原生 UX 设计规范,提升操作流畅度与视觉体验。
此外,对应用进行了边界场景处理:空列表状态下的提示优化、编辑空笔记的校验逻辑、删除最后一条笔记后的空状态重置,确保所有异常场景下应用均能稳定运行。通过多轮模拟器测试,验证了笔记编辑、删除、数据同步与持久化功能的稳定性,应用响应迅速、无卡顿、无数据丢失问题。
本篇完成的编辑与删除功能,为记事本应用构建了完整的笔记管理能力,进一步提升了产品的实用性与用户体验,也为后续笔记分类、搜索与分享功能的开发奠定了坚实基础。
更多推荐



所有评论(0)