docs(05): W52/E 复验补记 —— 「重试」不出现的根因是判据极性接反(已修,真机端到端通过)
根因:判据参数语义是「有没有东西」,调用点传了 isEmpty() ⇒ 唯一会求值的场景里结论恒假。 抓到方式:一次性诊断日志(三个输入全真而结论为假 ⇒ 只剩极性)。修在 0054a3a。 教训:判据单测全绿 ≠ 接线正确——极性/语义类错只有调用点会露,而调用点在 Compose、无 UI 测试装置 ⇒ 只能靠真机验收。这是设备验收抓住单测抓不到的错的第二例。
This commit is contained in:
1 parent
0054a3a97a
commit
46855af2dd
1 file changed
+6
@@ -1638,3 +1638,9 @@ S2 我第一次测出「没生效」,差点去改代码——真因是**设备
|
||||
1. **`mCurrentFocus` 之外还要防「别的 App 抢前台」**:Google Play 服务的账号核验页(`gms PreAddAccountActivity`)在我们操作期间抢了前台,我的 dump/截图**全打在它身上**,白跑好几轮。⇒ 判据第一步永远是 `dumpsys window | grep mCurrentFocus`;**看到不是本 App 就先清掉它**(`keyevent 4` × N + `keyevent 3`,再 `am start` 拉回来)。
|
||||
2. **`INTERNET` 权限的更正**(我先前说「release 可能没网络权限、得单独验」):W52K 跑了 `:app:processReleaseMainManifest` —— release 合并清单里**有** `INTERNET`,来自传递依赖 **`com.squareup.okhttp3:okhttp-android:5.5.0`**(不是 AGP 只给 debug 注入)。**结论:release 现在能联网,但那是搭在传递依赖上的** —— 换掉/排除 okhttp-android 会静默失去网络权限。建议无条件显式写进源码清单(一行,**还没做**)。
|
||||
3. **构建锁协议有洞**:这批有切片是**整文件删除**而不是只删自己那行 ⇒ 别人的占用行一起没了(W52B/W52K 都提到过)。下次按「一行一个占用者、只删自己那行、收工前先读一遍」写死。
|
||||
|
||||
### 4. 复验补记:W52/E 的「重试」已修(`0054a3a`,**真机端到端通过**)
|
||||
- **根因不是「我的状态模型不一致」,是接线极性**:判据 `shouldOfferRetryOnEmpty(loading, hasError, hasItems)` 的本体是 `!loading && hasError && !hasItems`,参数语义是「列表里**有没有**东西」;而**调用点传的是 `state.items.isEmpty()`**(极性相反)⇒ 在「列表为空」这个**唯一会求值**的场景里结论永远为 `false`、按钮永远不出现。
|
||||
- **怎么抓到的**:在 `ChatScreen` 那一支加一条**一次性诊断日志**,把 UI 实际看到的三个输入打出来 —— `loading=false hasError=true errorIsQueueFull=false items=0 retry=false`:**三个输入全真而结论为假** ⇒ 只剩「极性」一种可能。核对判据本体后确认。定位完日志已删(`grep CyreneRetry` = 0)。
|
||||
- **修 + 复验**:调用点改成 `state.items.isNotEmpty()`。真机复验:断网冷启动 ⇒「消息没能加载出来」+「重试」;**恢复网络后点它** ⇒ 发出 `GET /api/v1/sessions/web/messages`,**离线期间落库的那条出现在屏幕上**;列表非空后按钮自己消失。(顺带一条自查:我第一遍用 `grep 重试` 数按钮,结果那条消息的正文里正好也有「重试」二字 ⇒ 计数 1 是误报;按 dump 的节点看,按钮确实没了。)
|
||||
- **教训(值得单独记)**:**判据单测全绿 ≠ 接线正确**。极性 / 参数语义这类错在纯函数测试里永远看不见(测试调的是正确语义),**只有调用点会露** —— 而调用点在 Compose 里、项目又没有 UI 测试装置 ⇒ **这条只能靠真机验收**。这是「设备验收抓住单测抓不到的错」的第二例(第一例是 W50 的 `timestamp` 类型不符)。
|
||||
Reference in new issue
Block a user