欢迎加入开源鸿蒙跨平台社区: 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:运行测试功能

启动模拟器运行项目

  1. 测试功能:
    • 点右下角加号 → 写内容 → 点右上角对勾保存,出现在列表
    • 单击某条笔记 → 进入编辑,改完保存自动更新
    • 长按某条笔记 → 弹出确认框,可删除
    • 关闭 APP 重新打开,笔记还在(持久化生效)

四、Day4 功能总结

  1. 编辑器支持传入旧笔记内容,可编辑修改
  2. 首页列表单击编辑、长按删除
  3. 删除带确认弹窗,防止误删
  4. 编辑、删除后自动刷新列表 + 保存到本地
  5. 完全不丢数据,适配鸿蒙模拟器正常运行

五、小结---Flutter-OH 鸿蒙工具类应用实战 Day4:Note 记事本笔记编辑与删除功能实现

        工具类应用的核心竞争力,不仅在于数据存储,更在于数据的可编辑性与管理效率。对于记事本应用而言,笔记的修改与删除是高频刚需功能,直接影响用户体验与产品实用性。本篇基于前序搭建的 Flutter-OH 项目,为鸿蒙 Note 记事本补充笔记编辑、删除与列表刷新功能,完善数据全生命周期管理流程,实现从创建、查看、编辑到删除的完整闭环。

        开发中,首先为笔记列表项增加交互入口:点击笔记进入编辑页面,支持修改文本内容并保存更新;长按笔记弹出删除确认对话框,防止误操作。编辑页面复用 Day3 的 Markdown 编辑器组件,同时增加数据回传逻辑,将修改后的内容同步更新到本地存储与列表界面,实现编辑后即时生效。删除功能则采用二次确认机制,用户点击删除按钮后,系统弹出提示框确认操作,避免误删重要笔记,删除成功后自动刷新列表并更新持久化数据。

        为确保数据一致性,优化了状态管理逻辑:笔记修改或删除后,通过状态刷新更新列表视图,同时同步调用存储工具类更新本地数据,保障应用重启后数据状态与用户操作一致。针对 OpenHarmony 平台特性,优化了列表项点击反馈、对话框样式与动画效果,使其贴合鸿蒙原生 UX 设计规范,提升操作流畅度与视觉体验。

        此外,对应用进行了边界场景处理:空列表状态下的提示优化、编辑空笔记的校验逻辑、删除最后一条笔记后的空状态重置,确保所有异常场景下应用均能稳定运行。通过多轮模拟器测试,验证了笔记编辑、删除、数据同步与持久化功能的稳定性,应用响应迅速、无卡顿、无数据丢失问题。

        本篇完成的编辑与删除功能,为记事本应用构建了完整的笔记管理能力,进一步提升了产品的实用性与用户体验,也为后续笔记分类、搜索与分享功能的开发奠定了坚实基础。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐