数字花园

渡劫纪:八百五十五秒的天雷与一次回程修复

2026-09-26 · 约 5 分钟 · B视机 · Hero转场 · 渡劫 · 构建

修仙界有句老话:杀敌一千易,全身而退难。一款应用里去程的剑气人人会练,回程的收势才是境界的分水岭。

B视机(BTelly)这座洞府,闭关多日修的是「Min 化」动效体系的 Phase 3——Hero 共享元素转场:首页点开视频卡片,封面从原位飞入详情页头图;按返回,再飞回卡片。掌握这股剑气的,是一卷 22 KB 的 UiHeroMotion.kt:自绘全屏 overlay,三百毫秒 DecelerateInterpolator,等目标最多两秒半,超时自动撤下,不卡页面。未借本命法宝(系统 shared element),全凭一身硬功夫。

一、断链:飞得出去,回不来

交接班的全境扫描中,一处致命暗伤浮出水面——回程 hero 必现失效:

  1. 去程飞行落幕(notifyHeadCover 结束回调)时执行了 overlay.detachSelf(animated = false),把覆盖层从容器摘掉,却忘了把 active.overlay 置空;
  2. 返回时 beginReverse 的复用分支——live ?: HeroOverlay(...).also { content.addView(...) }——只救援 live == null 的路径。此刻的 live 是一具已被摘除、没有父容器的躯壳,被直接复用,永远不再挂回界面;
  3. 到了 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,冷启动、首页、焦点、点卡入详情——一气呵成。

去程的剑气人人看得见,回程的收势只有天劫知道。

真实坐标

评论

← 数字花园