SuperAPI AI 工具集

traversing-the-semantics-tree

通用与其它

查看项目

更新于 10-16 03:16

技能介绍

用途:当单一查找器(如 onNodeWithTag)无法定位 Compose 语义节点时,通过语义树导航找到目标,例如“某个 Text 的父节点”“Row 的第三个子节点”“任意可用的兄弟节点”。适用于第三方组件无法加 testTag、需验证结构关系、或需判断 .onChildren()[i].onChildAt(j) 链式写法是否正确的场景。

主要能力:单节点导航有 onParent()、onChild()、onChildAt(index)、onSibling()(均返回单个,0 或 >1 时失败),以及 onChildren()、onSiblings()、onAncestors()(返回集合,0 不报错)。集合收窄有 onFirst()、onLast()、[index]、filter(matcher)、filterToOne(matcher)。注意不存在单数 onAncestor,只有复数 onAncestors(),按 [parent, grandparent, …, root] 顺序返回;断言直接父节点用 onParent().assert(matcher) 或 hasParent(matcher)。useUnmergedTree 标志具有粘性:源节点设为 true 后,onChild/onParent/filter 均沿用,无需重复设置。

用法要点:优先给目标节点加 Modifier.testTag,而非深层 [index] 链,布局调整会让断言因错误原因通过。契约是“恰好一个匹配”时用 filterToOne(matcher)(多于一个会抛错),不要用 filter(matcher).onFirst()。onChildren() 是调用时的快照:LazyColumn/LazyRow 只返回当前已组合的可见项,需先 performScrollToIndex / performScrollToKey / performScrollToNode 再断言。按 key 查 LazyColumn 条目应改用 performScrollToKey。“任意祖先/后代”关系优先用 hasAnyAncestor / hasAnyDescendant 匹配器替代遍历链。

前提与验证:需可用的 ComposeTestRule / ComposeUiTest,并熟悉 merged 与 unmerged 树区别。验证可运行 ./gradlew :app:connectedDebugAndroidTest 或 :app:testDebugUnitTest。参考资料包括 Compose 测试概览、速查表、语义文档及 Selectors.kt、SemanticsNodeInteraction.kt、Filters.kt 等源码。具体收费与平台信息暂未提供。