fix: 修复关闭应用后窗口大小无法恢复的问题#417
Conversation
退出时 `replacementState` 判断条件有误,`replaceWindow` 为 null 时 走 `getBounds()` 分支创建了空对象,导致 `??` 短路未加载已保存的窗口 状态。同时调整 `saveWindowState` 在 `win.hide()` 之前调用,确保获取 正确的窗口 bounds。
|
Claude finished @lwt-sadais's task in 2m 13s —— View job 🔍 代码审查报告
📊 审查概览 · 一目了然
🏆 代码质量评分📋 问题分布🎯 关键发现
✅ 变更分析本次 PR 修改了 改动 1:修复
|
| 🏆 质量指标 | 📊 当前分数 | 🎯 目标分数 | 📈 改进方向 |
|---|---|---|---|
| 代码质量 | 90/100 | 90+ | ✅ 达标 |
| 安全等级 | 100/100 | 100 | ✅ 优秀 |
| 性能优化 | 100/100 | 85+ | ✅ 优秀 |
🐛 问题清单与修复指南 · 📋 点击展开查看
📋 **👆 点击此处展开详细问题列表 (共 1 个问题) · 一键复制追踪 📌**
🚀 快速开始:
- 📍 点击文件路径可直接跳转到问题代码
- 📝 每个问题都包含具体修复方案
- 💬 可直接引用问题编号(如 fix: 彻底修复终端渲染问题(花屏和字体设置闪烁) #1)进行讨论
⚡ 轻微级别 (Minor) 优化建议
🔵 #1 src/main/windows/MainWindow.ts:270
🏷️ 类型: 代码健壮性 | ⏰ 优先级:
P2 - 后续版本| 🎯 影响范围: 局部
-
🔍 问题描述:
forceReplaceCloseCurrentWindow在saveWindowState后立即设置forceClose = true并依次调用hide()和close()。如果saveWindowState抛出异常(虽然内部有try-catch保护),后续流程仍会继续,这是正确的。但如果未来saveWindowState的实现变更移除了try-catch,forceClose将不会被设置,可能导致close事件中再次触发确认弹窗。当前实现没有问题,仅作为代码演进时的注意点。 -
🛠️ 建议:当前
saveWindowState内部的try-catch {}已经保证了健壮性,无需修改。后续如果该函数有重构,需注意保持异常安全。 -
⚠️ 潜在影响:当前无影响,仅为防御性建议。
📊 修复优先级矩阵
| 🎯 优先级 | 🚨 严重 | ⚡ 轻微 | 📈 总计 | |
|---|---|---|---|---|
| 🔴 P0 | 0 个 | - | - | 0 个 |
| 🟡 P1 | - | 0 个 | - | 0 个 |
| 🔵 P2 | - | - | 1 个 | 1 个 |
| 📊 合计 | 0 | 0 | 1 | 1 个 |
🎯 合并决策建议
📋 合并评估结果
| 📊 评估维度 | ⭐ 得分 | 🎯 状态 | 💭 说明 |
|---|---|---|---|
| 🔐 安全性 | 10/10 | ✅ 通过 | 无安全风险,纯逻辑修正 |
| 📊 代码质量 | 9/10 | ✅ 优秀 | 修复精准,代码清晰可读 |
| ⚡ 性能影响 | 10/10 | ✅ 无影响 | 无新增开销 |
| 🛠️ 功能完整性 | 9/10 | ✅ 完整 | 覆盖了所有关闭路径 |
| 🧪 测试覆盖 | 7/10 | Electron 主进程逻辑难以自动化测试,建议手动验证 |
📈 综合评分: 45/50 分 · 等级: 优秀
🚦 最终建议
✅ 建议合并
📝 详细理由:
- 🟢 根因分析准确,修复精准针对可选链
?.在null值上的假值陷阱- 🟢 三处改动互相配合,形成完整的修复方案:条件修正 + 保存时序修正 + 路径拆分
- 🟢
saveWindowState移至hide()前调用,确保getBounds()数据可靠- 🟢 无安全风险,无性能影响,变更范围可控
- 🟢 PR 描述清晰,根因分析和修复思路一目了然
🎯 具体行动建议:
-
合并前建议手动验证:
- 正常关闭应用 → 重新打开 → 确认窗口尺寸和位置已恢复
- 最大化后关闭 → 重新打开 → 确认恢复为最大化状态
- 自动更新退出场景下窗口状态也能正确保存(如有条件)
-
后续版本改进:
- 考虑为窗口状态保存/恢复添加日志,便于排查类似问题
问题描述
点击关闭按钮或按 Cmd+Q 退出应用后,再次打开应用时窗口大小没有恢复为关闭前的大小,而是变成了偏小的固定尺寸。
根因分析
createMainWindow中replacementState的判断条件使用了可选链?.:当
options.replaceWindow为null时,null?.isDestroyed()返回undefined(假值),走了 else 分支,创建了空对象{}。随后state = {} ?? loadWindowState()中,空对象不是null/undefined,??不会触发loadWindowState(),导致窗口使用空对象的默认值创建,大小不正确。修复内容
修复
replacementState判断逻辑:先判断replaceWindow存在且未销毁才使用其状态,否则为null,让??正确走到loadWindowState()调整
saveWindowState时机:在forceReplaceCloseCurrentWindow中移至win.hide()之前调用,确保getBounds()在窗口可见时获取正确的值,避免hide()后 bounds 异常