问题背景
在实现文本文件编辑保存功能后,出现了两个严重问题:
- 文本文件保存后在当前目录列表中“消失”,我这边感知为文件丢失。
- 文本文件可编辑,但保存后列表中的文件大小、更新时间不变,给人感觉“没保存成功”。
问题分析
文件“消失”原因
- 编辑后更新元信息时,直接用服务端返回的
FileMetadata覆盖了本地列表中的旧数据。 - 服务端返回的元信息中,
path字段与当前客户端视图期望的路径有不一致(可能为根或默认路径)。 - 结果是:
- 本地列表里该条目被替换为一个 path 不同的对象;
- 当前目录过滤时,找不到这个文件,表现为“消失了”。
元信息不刷新的原因
- 文本保存接口返回的新 size、更新时间等没有正确写回本地缓存;
- UI 只依赖本地
_files列表的元信息,没有从服务器重新同步; - 保存成功后不刷新列表就返回,我这边看到的仍然是旧值。
这两个问题本质上都是元信息更新策略不当导致的。
解决方案
核心原则:只更新真正变化的字段,保持路径等关键定位字段不变。
局部更新元信息
- 在
AppState中增加一个专门的元信息更新方法,例如updateFileMetadata:- 根据 id 找到
_files中的旧条目; - 使用
copyWith只更新 size、encryptedSize、mimeType、updatedAt 等字段; - 不修改 path、name、isDir 等定位和结构信息。
- 根据 id 找到
- 调用该方法后:
- 同步到本地元数据存储(例如 S3 元数据、数据库);
notifyListeners触发 UI 刷新。
文本编辑保存流程调整
- 文本编辑页保存成功后:
- 不再直接依赖接口返回的完整
FileMetadata覆盖本地; - 而是拿到需要更新的字段,调用
updateFileMetadata; - 返回时列表自然会显示新的大小和更新时间。
- 不再直接依赖接口返回的完整
收获
- 这类“编辑后文件消失”的 bug,往往不是删除了,而是路径或过滤条件被改坏了。
- 在有本地缓存的架构下,元信息更新要谨慎:
- 尽量做“局部更新”而不是“整对象替换”;
- 特别注意 path、id、isDir 这类会影响列表过滤和层级结构的字段。