|
| 1 | +# 框架稳定性与断言异常修复 |
| 2 | + |
| 3 | +在文件管理功能的深度集成过程中,我们遇到了几类涉及 Flutter 框架层面的断言异常(Assertion Failure)。这些异常主要集中在 `MouseTracker` 和 `RenderBox` 的布局状态检测上,通常表现为应用在频繁点击、滚动或右键菜单交互时崩溃。 |
| 4 | + |
| 5 | +## 核心问题分析 |
| 6 | + |
| 7 | +### 1. MouseTracker 状态冲突 (`!_debugDuringDeviceUpdate`) |
| 8 | +**异常现象**:`Failed assertion: line 199 pos 12: '!_debugDuringDeviceUpdate': is not true.` |
| 9 | +**原因分析**: |
| 10 | +该异常发生在 `MouseTracker` 正在处理设备更新(如鼠标移动)时,又同步触发了另一次设备更新。在我们的应用中,这是由于在同步的 `onSecondaryTapDown`(右键点击)直接调用了 `showMenu`,导致 `Overlay` 同步插入并可能立即触发焦点变化或新的布局测试,从而干扰了正在进行的鼠标状态追踪循环。 |
| 11 | + |
| 12 | +### 2. RenderBox 布局异常 (`Cannot hit test a render box that has never been laid out`) |
| 13 | +**异常现象**:命中测试(Hit Testing)路径中包含尚未完成布局的组件。 |
| 14 | +**原因分析**: |
| 15 | +- **GlobalObjectKey 过重**:在海量列表项中使用 `GlobalObjectKey` 会显著增加布局负担。当列表快速刷新或过滤时,旧的定位锚点可能在下一帧布局前被命中测试系统尝试访问。 |
| 16 | +- **同步 UI 更新**:在手势回调中同步触发重大的 UI 结构变动(如打开菜单或切换面板),可能导致当前的命中测试路径指向已失效或未初始化的 RenderBox。 |
| 17 | + |
| 18 | +--- |
| 19 | + |
| 20 | +## 解决方案 |
| 21 | + |
| 22 | +### 1. 异步触发 Context Menu (Future.microtask) |
| 23 | +为了确保 Overlay 的弹出不干扰手势处理循环,我们将所有页面(`AllPage`, `FilePage`, `FolderPage`)中的快捷菜单显示逻辑进行了 microtask 封装: |
| 24 | + |
| 25 | +```dart |
| 26 | +onSecondaryTapDown: (details) { |
| 27 | + // 使用 microtask 确保离开当前的手势/命中测试堆栈后执行 |
| 28 | + Future.microtask(() async { |
| 29 | + if (!mounted) return; |
| 30 | + final result = await showMenu(...); |
| 31 | + // 处理结果... |
| 32 | + }); |
| 33 | +} |
| 34 | +``` |
| 35 | + |
| 36 | +### 2. 优化列表 Key 管理 (ValueKey) |
| 37 | +移除了 `AllPage` 列表项中不必要的 `GlobalObjectKey`,统一改用轻量级的 `ValueKey(entity.path)`。 |
| 38 | +- **优势**:减少了全局 Key 注册表维护开销,稳定了列表项在动态过滤和排序时的布局语义,消除了 layout-during-hit-test 的隐患。 |
| 39 | + |
| 40 | +### 3. 下一代键盘事件 API 迁移 (KeyEvent) |
| 41 | +将原有的 `RawKeyboard` 监听完全迁移至现代化的 `HardwareKeyboard` 和 `KeyEvent` API(`KeyDownEvent`, `KeyUpEvent`)。 |
| 42 | +- **逻辑增强**:统一了对 Ctrl、Delete 等修饰键和功能键的处理逻辑。 |
| 43 | +- **健壮性**:不仅通过事件流判断按键,还通过 `isLogicalKeyPressed` 进行辅助状态校验,彻底解决了“按键状态不同步”导致的 Services 断言失败。 |
| 44 | + |
| 45 | +--- |
| 46 | + |
| 47 | +## 验证与稳定性提升 |
| 48 | +经过上述调整,应用在高频右键、快速滚动以及 Ctrl+C/V 等快捷操作下的稳定性得到了极大提升, terminal 中不再出现 `MouseTracker` 或 `RenderBox` 相关的断言报错。 |
0 commit comments