文本文件编辑后“消失”与元信息更新问题

December 14, 2025
2 min read
By devshan

Table of Contents

This is a list of all the sections in this post. Click on any of them to jump to that section.

问题背景

在实现文本文件编辑保存功能后,出现了两个严重问题:

  1. 文本文件保存后在当前目录列表中“消失”,我这边感知为文件丢失。
  2. 文本文件可编辑,但保存后列表中的文件大小、更新时间不变,给人感觉“没保存成功”。

问题分析

文件“消失”原因

  • 编辑后更新元信息时,直接用服务端返回的 FileMetadata 覆盖了本地列表中的旧数据。
  • 服务端返回的元信息中,path 字段与当前客户端视图期望的路径有不一致(可能为根或默认路径)。
  • 结果是:
    • 本地列表里该条目被替换为一个 path 不同的对象;
    • 当前目录过滤时,找不到这个文件,表现为“消失了”。

元信息不刷新的原因

  • 文本保存接口返回的新 size、更新时间等没有正确写回本地缓存;
  • UI 只依赖本地 _files 列表的元信息,没有从服务器重新同步;
  • 保存成功后不刷新列表就返回,我这边看到的仍然是旧值。

这两个问题本质上都是元信息更新策略不当导致的。

解决方案

核心原则:只更新真正变化的字段,保持路径等关键定位字段不变

局部更新元信息

  • AppState 中增加一个专门的元信息更新方法,例如 updateFileMetadata
    • 根据 id 找到 _files 中的旧条目;
    • 使用 copyWith 只更新 size、encryptedSize、mimeType、updatedAt 等字段;
    • 不修改 path、name、isDir 等定位和结构信息。
  • 调用该方法后:
    • 同步到本地元数据存储(例如 S3 元数据、数据库);
    • notifyListeners 触发 UI 刷新。

文本编辑保存流程调整

  • 文本编辑页保存成功后:
    • 不再直接依赖接口返回的完整 FileMetadata 覆盖本地;
    • 而是拿到需要更新的字段,调用 updateFileMetadata
    • 返回时列表自然会显示新的大小和更新时间。

收获

  • 这类“编辑后文件消失”的 bug,往往不是删除了,而是路径或过滤条件被改坏了
  • 在有本地缓存的架构下,元信息更新要谨慎:
    • 尽量做“局部更新”而不是“整对象替换”;
    • 特别注意 path、id、isDir 这类会影响列表过滤和层级结构的字段。