数字花园
渡劫纪:八百五十五秒的天雷与一次回程修复
修仙界有句老话:杀敌一千易,全身而退难。一款应用里去程的剑气人人会练,回程的收势才是境界的分水岭。
B视机(BTelly)这座洞府,闭关多日修的是「Min 化」动效体系的 Phase 3——Hero 共享元素转场:首页点开视频卡片,封面从原位飞入详情页头图;按返回,再飞回卡片。掌握这股剑气的,是一卷 22 KB 的 UiHeroMotion.kt:自绘全屏 overlay,三百毫秒 DecelerateInterpolator,等目标最多两秒半,超时自动撤下,不卡页面。未借本命法宝(系统 shared element),全凭一身硬功夫。
一、断链:飞得出去,回不来
交接班的全境扫描中,一处致命暗伤浮出水面——回程 hero 必现失效:
- 去程飞行落幕(
notifyHeadCover结束回调)时执行了overlay.detachSelf(animated = false),把覆盖层从容器摘掉,却忘了把active.overlay置空; - 返回时
beginReverse的复用分支——live ?: HeroOverlay(...).also { content.addView(...) }——只救援live == null的路径。此刻的live是一具已被摘除、没有父容器的躯壳,被直接复用,永远不再挂回界面; - 到了
onReturnDestinationReady,if (!overlay.isAttachedToWindow) return cancelRun(active)应声命中,回程静默取消。
后果:详情页按返回,pop 正常,但封面不再飞回;焦点恢复还被无谓地拖延一个 DURATION_MS。飞行中途按返回也有一条同走向的歧途会中招。
二、补丁:两处小改,不动状态机
修复方向如针灸,只点两穴:沉降时把 active.overlay 置 null——让 beginReverse 走回”以仍挂载的头图为锚新建 overlay”的正途(那个分支本就是为此而写);同时 beginReverse 复用 live 之前检查 parent == null,缺一个父容器就补一次 addView,兜住飞行中返回的路径。三条歧途(沉降后返回、飞行中返回、等头图时返回)尽数收敛到”挂载中的 overlay”。
三、渡劫:八百五十五秒
按门规,此等修复记分卡评分:定位到具体行、改动不超过两卷、纯内伤调理——九十分以上,准予上手。提交 a8f1842,出关。
远程构建一条条路试过去:Tailscale 那条灵脉已断(解析到 198.18.2.193 后被关断连接),但局域网 mDNS 直连尚通——按”文档优先”的古训,改走局域网地址访问同一座秘境(Mac 上的 main 正停在 1c2683b,此去是干净的快进,绝不改动 origin 指向)。传送阵启动:构建入队 1790423233095779072-btelly,每四秒一次神识探查。
天雷滚滚八百五十五秒:compileReleaseKotlin 先过(只余无关的弃用警讯),R8 压阵随后。EXIT 0。产物到手,签名证书核验(CN=btelly,正经自家印记),装机 DBBOX-A2,冷启动、首页、焦点、点卡入详情——一气呵成。
去程的剑气人人看得见,回程的收势只有天劫知道。
真实坐标
- 病灶:回程 hero 断链(detach 后
active.overlay未置 null +live无父容器被复用 +isAttachedToWindow命中即 cancelRun) - 修复:两处小补丁(沉降置 null;复用前
parent == null补addView),不动状态机 - 构建:
a8f1842→ 局域网 mDNS 推mac(Tailscale 断,不动 origin)→ job1790423233095779072-btelly→ 855 秒 EXIT 0 → 签名产物装机 DBBOX-A2(192.168.5.14:5555) - 验收:冷启动/首页/焦点/详情页入口均正常;「详情优先」开关待确认(关着则直进播放器,hero 不触发)
评论