Skip to content

Commit 1d568b5

Browse files
authored
[1288] 修复首次点击登录按钮看不到登录信息 (#4527)
1 parent 66035b2 commit 1d568b5

2 files changed

Lines changed: 63 additions & 3 deletions

File tree

devel/1288.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# 1288: 修复首次点击登录按钮看不到登录信息
2+
3+
## 任务需求
4+
5+
标题栏「领取会员」按钮右侧的登录(用户中心)按钮,第一次点击弹出的用户
6+
弹窗看不到登录信息(显示的是「未登录/非会员」占位内容),第二次点击才能
7+
看到登录信息。
8+
9+
## 现状分析
10+
11+
- `LoginDialog` 为惰性创建(`ensureLoginDialog`,创建耗时 ~100ms,为不拖慢
12+
首屏而推迟到首次使用,见 `qt_tm_widget.cpp` 中登录按钮的注释)。
13+
- 点击登录按钮走 `checkLocalTokenAndLogin`:本地有 token 时调用
14+
`fetchUserInfo (token, true)` 异步请求用户信息。
15+
- 网络回调中先 `updateDialogContent`(往 `nameLabel`/`accountIdLabel`
16+
标签写用户信息),之后才 `ensureLoginDialog` 创建弹窗。首次点击时这些
17+
标签还是 `nullptr`,写入被 `if (nameLabel)` 守卫全部跳过,随后创建的
18+
弹窗只能显示 `setupLoginDialog` 里的默认占位内容。
19+
- 第二次点击时弹窗已存在,标签可正常写入,故能显示登录信息。
20+
- `handleError` 分支同构:`showNotLoggedInDialog` 写错误信息到
21+
`accountIdLabel` 时标签尚未创建,首次点击丢失错误提示。
22+
23+
## What
24+
25+
1. `fetchUserInfo` 网络回调的成功分支:`showDialog` 为 true 时先
26+
`ensureLoginDialog ()` 创建弹窗,再 `updateDialogContent`,最后
27+
`show_login_dialog_at_button` 复用已创建的 `m_loginDialog`
28+
2. `handleError`:同样先 `ensureLoginDialog ()` 再写错误内容再显示。
29+
3. 后台刷新路径(`refreshMembershipInfoInBackground`
30+
`fetchUserInfo (token, false)`)行为不变:仍不提前创建弹窗,保持惰性
31+
创建优化;弹窗内容的准确性由每次点击时的重新拉取保证。
32+
33+
## Why
34+
35+
弹窗内容控件(标签)随弹窗一起惰性创建,先更新内容后创建弹窗的顺序使
36+
首次显示必然丢失内容。
37+
38+
## How
39+
40+
调整 `fetchUserInfo` 回调中「创建弹窗 → 更新内容 → 显示」的顺序,并把
41+
显示入口从 `ensureLoginDialog ()` 改为直接传 `m_loginDialog`(此时必已
42+
创建)。
43+
44+
## 涉及文件
45+
46+
- `src/Plugins/Qt/qt_tm_widget.cpp``fetchUserInfo` 回调的成功分支与
47+
`handleError` 各提前一次 `ensureLoginDialog ()`
48+
49+
## 验证
50+
51+
- `xmake b stem` 增量编译通过。
52+
- `gf fmt --changed-since=main` 无格式问题。

src/Plugins/Qt/qt_tm_widget.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3241,10 +3241,12 @@ qt_tm_widget_rep::fetchUserInfo (const QString& token, bool showDialog) {
32413241
manager->deleteLater ();
32423242
return;
32433243
}
3244-
// 定义统一的错误处理逻辑
3244+
// 定义统一的错误处理逻辑。弹窗为惰性创建,须先 ensureLoginDialog
3245+
// 生成标签,showNotLoggedInDialog 才能把错误信息写进 accountIdLabel
32453246
auto handleError= [this] (const QString& errorMessage) {
3247+
ensureLoginDialog ();
32463248
showNotLoggedInDialog (qt_translate (from_qstring (errorMessage)));
3247-
show_login_dialog_at_button (ensureLoginDialog (), loginButton);
3249+
show_login_dialog_at_button (m_loginDialog, loginButton);
32483250
};
32493251

32503252
if (reply->error () == QNetworkReply::NoError) {
@@ -3270,6 +3272,12 @@ qt_tm_widget_rep::fetchUserInfo (const QString& token, bool showDialog) {
32703272
QString productType=
32713273
userData["productType"].toString ("Subscribe Now");
32723274

3275+
// 首次点击时弹窗尚未创建(惰性创建),标签为空会导致
3276+
// updateDialogContent 写不进用户信息,须先创建弹窗再更新内容
3277+
if (showDialog) {
3278+
ensureLoginDialog ();
3279+
}
3280+
32733281
// 更新弹窗内容
32743282
updateDialogContent (true, userName, accountEmail, avatarText,
32753283
memberType, periodLabel, periodLabelColor,
@@ -3280,7 +3288,7 @@ qt_tm_widget_rep::fetchUserInfo (const QString& token, bool showDialog) {
32803288
periodLabelColor, productType);
32813289

32823290
if (showDialog) {
3283-
show_login_dialog_at_button (ensureLoginDialog (), loginButton);
3291+
show_login_dialog_at_button (m_loginDialog, loginButton);
32843292
}
32853293
}
32863294
else {

0 commit comments

Comments
 (0)