Files
StellarX-kaifa/开发记录/Fix/Fix-BUG-20251220-0001-TabControl-setActiveIndex绘制前调用崩溃.md
T

70 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Fix-BUG-20251220-0001
> 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。
## 关联信息
- Fix ID: Fix-BUG-20251220-0001
- 关联 BUG ID: BUG-20251220-0001
- 修复目标: 正确支持绘制前设置默认激活页,并在首次绘制时激活对应页面;运行时调用则立即切换,且不崩溃。
- 状态:已完成
- 负责人: 未记录
- 分支 / 版本: master / v2.3.2
## 根因分析
- 根因: `setActiveIndex()` 在设置默认激活时直接调用页签按钮点击回调,但绘制前页签按钮部分内部指针尚未初始化,导致空指针访问。
- 触发条件: 绘制前调用 `TabControl::setActiveIndex()`。
- 为什么之前没发现:[可选] 测试缺失,未覆盖绘制前设置默认激活页的生命周期场景。
- 关键证据:[可选] 最小复现仅需创建 TabControl 并在绘制前调用 `setActiveIndex(0)`。
## 修复方案
- 修复思路: 首次绘制前调用 `setActiveIndex()` 时只记录默认激活索引,不立即调用页签按钮点击回调;在 `TabControl::draw()` 完成基础绘制后再应用默认激活。
- 关键改动:
- `TabControl::setActiveIndex()` 在首次绘制前仅记录默认激活页索引。
- `TabControl::draw()` 绘制完成后检查是否为首次绘制、是否设置默认激活页、索引是否合法。
- 新增成员 `TabControl::IsFirstDraw`,用于判断是否首次绘制。
- 新增成员 `TabControl::defaultActivation`,用于记录默认激活索引;未设置时为 `-1`。
- 涉及文件 / 类 / 函数:
- `TabControl.h`
- `TabControl.cpp`
- `TabControl::setActiveIndex()`
- `TabControl::draw()`
- 影响的 API / 行为:[可选] 对外接口不变;内部延迟首次激活流程。
- 关键约束 / 不变量:[可选]
- 首次绘制前的默认激活只记录,不触发未初始化对象的点击回调。
- 首次绘制后调用 `setActiveIndex()` 应立即切换激活页。
- 回滚点 / 开关:[可选] 回退默认激活延迟应用逻辑。
## 影响评估
- 影响范围: TabControl 默认激活、首次绘制、运行时程序化切页。
- 兼容性影响:无(对外接口不变)
- 行为变化:有(绘制前设置默认激活页改为首次绘制后应用)
- 性能影响:无明显影响。
- 回归风险:
- 默认激活索引越界时的行为需要与既有预期保持一致。
- 开关模式下页签按钮选中态需要与激活页同步。
## 验证结果
- 验证步骤:
1. 创建页签数为 2 的 TabControl。
2. 分别在绘制前调用 `setActiveIndex(0)`、`setActiveIndex(1)`、越界索引。
3. 确认索引 0 / 1 在首次绘制时激活对应页面,按钮处于选中状态。
4. 运行过程中通过 Button 回调调用 `setActiveIndex()`,确认立即切换激活页。
5. 验证未调用 `setActiveIndex()` 时默认不激活任何页面。
- 验证结果: PDF 历史记录标记已修复。
- 回归检查:[可选] 页签点击切换、程序化切换、默认不激活场景、开关模式选中态、页签数量变化与越界索引行为。
- 验证证据:[可选]
## 落地信息
- Commit: 0c1cf2938f0d6c5684eeb318f17a8443e0c8cf5a
- PR:[可选] git 推送
- 发布版本: v2.3.2
- 备注: 来源原始 Fix 记录未包含 `-XXXX` 后缀,入库时按 BUG ID 补充为 `Fix-BUG-20251220-0001`。