我有一个包含简单TextView
的AndroidView
组合。
我想打印AndroidView
的语义树,包括TextView的完整树。
当我尝试下面的printToLog
时,它不包括TextView节点,并且AssertionError
测试失败(见下文)。
如何将TextView节点包含到树中?
@OptIn(ExperimentalCoroutinesApi::class)
class AndroidViewTester {
@get:Rule
val composeRule = createComposeRule()
@Before
fun setUp() {
composeRule.setContent {
AndroidViewExample()
}
}
@Composable
fun AndroidViewExample() {
val text by remember { mutableStateOf("TextView text") }
Column(
modifier = Modifier
.fillMaxSize()
.semantics(false) { contentDescription = "Column" }
) {
Text("Composable text")
MyTextView(text)
}
}
@Composable
fun MyTextView(text: String) {
AndroidView(
factory = { context ->
TextView(context).apply {
setText(text)
}
},
update = { view ->
(view as TextView).append(" $text")
},
modifier = Modifier
.fillMaxSize()
.semantics(mergeDescendants = false) {
contentDescription = "My Android View"
}
)
}
测试
@Test
fun AndroidViewSemanticsTest() = runTest {
composeRule.onAllNodes(isRoot(), useUnmergedTree = true)
.printToLog("Print Root", maxDepth = 10)
composeRule.onNode(hasText("TextView text"))
.assertExists()
/** java.lang.AssertionError: Failed: assertExists.
Reason: Expected exactly '1' node but could not find any node that satisfies:
(Text + EditableText contains 'TextView text' (ignoreCase: false))
*/
}
}
printToLog输出
Printing with useUnmergedTree = 'true'
Node #1 at (l=0.0, t=220.0, r=1080.0, b=2208.0)px
|-Node #2 at (l=0.0, t=220.0, r=1080.0, b=2208.0)px
ContentDescription = '[Column]'
|-Node #3 at (l=0.0, t=220.0, r=286.0, b=272.0)px
| Text = '[Composable text]'
| Actions = [GetTextLayoutResult]
|-Node #4 at (l=0.0, t=272.0, r=1080.0, b=2208.0)px
ContentDescription = '[My Android View]'
MergeDescendants = 'true'
1条答案
按热度按时间oalqel3c1#
我试了一个简单的例子。
似乎
AndroidView
不提供任何语义。在Modifier.semantics
范围内,我发现了一个set方法。Assert
composeTestRule.onNodeWithText("TextView text").assertExists()
仍然失败。然后,我意识到已经有一个
text
字段。它似乎是一个默认的SemanticsProperty。
也使用了名称“Text”,但类型不同(
List<AnnotatedString>
而不是String
)。