为所有4个Panel添加了生命周期管理

SDKManager改用协程确保依赖安全
This commit is contained in:
2026-04-14 02:31:51 +08:00
parent 2ef540c7e5
commit e3842d05da
8 changed files with 125 additions and 1 deletions

View File

@@ -0,0 +1,17 @@
{
"version": 2,
"sessions": {
"b51153a0b3224c0f80f1360a506ca525": [
{
"expertId": "TestResultsAnalyst",
"name": "Lyra",
"profession": "测试结果分析师",
"avatarUrl": "https://acc-1258344699.cos.accelerate.myqcloud.com/workbuddy/experts/avatars/08-QualityAssurance/TestResultsAnalyst/TestResultsAnalyst.png",
"promptUrl": "https://acc-1258344699.cos.accelerate.myqcloud.com/workbuddy/experts/experts/08-QualityAssurance/TestResultsAnalyst/TestResultsAnalyst_zh.md",
"usedAt": 1776104693623,
"industryId": "08-QualityAssurance"
}
]
},
"lastUpdated": 1776104980483
}

View File

@@ -0,0 +1,19 @@
# 2026-04-14 工作日志
## SDK代码质量修复
### 完成项
1. **事件监听内存泄漏修复** - 为所有Panel添加OnDisable/OnDestroy中的监听器移除逻辑
- LoginPanel.cs
- RegisterPanel.cs
- ChangePasswordPanel.cs
- RealNameAuthPanel.cs
2. **单例初始化时序问题修复** - SDKManager改用协程确保SDKUIManager先初始化
- SDKManager.cs:Start() 改用 AutoRegisterPanelsCoroutine() 协程
- 添加最多10帧的等待和重试逻辑
### 待办
- P0: 移除敏感数据日志 (LoginPanel:473, RealNameAuthPanel:56)
- P1: 添加网络请求封装
- P2: 建立测试框架

View File

@@ -28,6 +28,21 @@ namespace GameSDK
backBtn.onClick.AddListener(OnBackClick); backBtn.onClick.AddListener(OnBackClick);
} }
private void OnDisable()
{
if (!initialized) return;
initialized = false;
confirmBtn.onClick.RemoveListener(OnConfirmClick);
backBtn.onClick.RemoveListener(OnBackClick);
}
private void OnDestroy()
{
initialized = false;
if (confirmBtn != null) confirmBtn.onClick.RemoveListener(OnConfirmClick);
if (backBtn != null) backBtn.onClick.RemoveListener(OnBackClick);
}
private void OnConfirmClick() private void OnConfirmClick()
{ {
string username = usernameInput.text.Trim(); string username = usernameInput.text.Trim();

View File

@@ -451,6 +451,26 @@ namespace GameSDK
if (guestLoginBtn != null) guestLoginBtn.onClick.AddListener(OnGuestLoginClick); if (guestLoginBtn != null) guestLoginBtn.onClick.AddListener(OnGuestLoginClick);
} }
private void UnbindButtons()
{
if (!initialized) return;
initialized = false;
if (loginBtn != null) loginBtn.onClick.RemoveListener(OnLoginClick);
if (registerBtn != null) registerBtn.onClick.RemoveListener(OnRegisterClick);
if (changePasswordBtn != null) changePasswordBtn.onClick.RemoveListener(OnChangePasswordClick);
if (guestLoginBtn != null) guestLoginBtn.onClick.RemoveListener(OnGuestLoginClick);
}
private void OnDisable()
{
UnbindButtons();
}
private void OnDestroy()
{
UnbindButtons();
}
#endregion #endregion
private void OnLoginClick() private void OnLoginClick()

View File

@@ -26,6 +26,21 @@ namespace GameSDK
skipBtn.onClick.AddListener(OnSkipClick); skipBtn.onClick.AddListener(OnSkipClick);
} }
private void OnDisable()
{
if (!initialized) return;
initialized = false;
submitBtn.onClick.RemoveListener(OnSubmitClick);
skipBtn.onClick.RemoveListener(OnSkipClick);
}
private void OnDestroy()
{
initialized = false;
if (submitBtn != null) submitBtn.onClick.RemoveListener(OnSubmitClick);
if (skipBtn != null) skipBtn.onClick.RemoveListener(OnSkipClick);
}
private void OnSubmitClick() private void OnSubmitClick()
{ {
string realName = realNameInput.text.Trim(); string realName = realNameInput.text.Trim();

View File

@@ -27,6 +27,21 @@ namespace GameSDK
backBtn.onClick.AddListener(OnBackClick); backBtn.onClick.AddListener(OnBackClick);
} }
private void OnDisable()
{
if (!initialized) return;
initialized = false;
registerBtn.onClick.RemoveListener(OnRegisterClick);
backBtn.onClick.RemoveListener(OnBackClick);
}
private void OnDestroy()
{
initialized = false;
if (registerBtn != null) registerBtn.onClick.RemoveListener(OnRegisterClick);
if (backBtn != null) backBtn.onClick.RemoveListener(OnBackClick);
}
private void OnRegisterClick() private void OnRegisterClick()
{ {
string username = usernameInput.text.Trim(); string username = usernameInput.text.Trim();

View File

@@ -38,7 +38,30 @@ namespace GameSDK
private void Start() private void Start()
{ {
// Start 在所有 Awake 之后执行,此时 SDKUIManager.Instance 一定已初始化 // 使用协程确保 SDKUIManager 单例已完全初始化
StartCoroutine(AutoRegisterPanelsCoroutine());
}
private System.Collections.IEnumerator AutoRegisterPanelsCoroutine()
{
// 等待一帧,确保所有单例初始化完成
yield return null;
// 再次检查 SDKUIManager 是否已就绪
int maxRetries = 10;
int retries = 0;
while (SDKUIManager.Instance == null && retries < maxRetries)
{
yield return null;
retries++;
}
if (SDKUIManager.Instance == null)
{
Debug.LogError("[SDK] SDKUIManager 初始化失败,请检查场景配置");
yield break;
}
AutoRegisterPanels(); AutoRegisterPanels();
if (autoShowLogin && panelsRegistered) if (autoShowLogin && panelsRegistered)