对于android.widget.Button
,我可以使用performClick()
以编程方式模拟单击。但我不知道如何在Jetpack Compose中做到这一点。我已经查看了compose.material
文档,但我至少找不到关于此的任何内容。
使用此解决方案,您将以编程方式获得涟漪效应,就像您按下按钮一样:
1)创建interactionSource:
val interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
2)创建协程作用域:
val coroutine = rememberCoroutineScope()
3)在你的按钮集交互源:
Button(
onClick = {
vm.myFunction()
},
//important
interactionSource = interactionSource,
.
.
.
)
4)最后在任何地方像这样调用它:
coroutine.launch {
val press = PressInteraction.Press(Offset.Zero)
interactionSource.emit(press)
vm.myFunction()
delay(300)
interactionSource.emit(PressInteraction.Release(press))
}
在compose中,你正在创建一个带有动作的按钮。您可以通过编程方式传递操作函数并调用相同的函数。
// you need to remember your callback to prevent extra recompositions.
// pass all variables that may change between recompositions
// as keys instead of `Unit`
val onClickAction = remember(Unit) {
{
// do some action
}
}
LaunchedEffect(Unit) {
// perform action in 1 sec after view appear
delay(1000)
onClickAction()
}
Button(
onClick = onClickAction
) {
Text(text = "Button")
}
我将用ComposeTestRule
编写一个仪器测试。performClick()
通常在SemanticNodeInteraction
对象上按预期工作。
我确实遇到了一个问题,它只在元素当前可见时起作用,所以我需要先调用performScrollTo()
:
composeTestRule.onNode(...).run {
performScrollTo()
performClick()
}
一个非常简单的解决方案。
-
创建状态变量
val verifyNumberOnClick = remember { mutableStateOf(false) }
-
创建一个私有函数,可以作为onClick的动作。
private fun makeSum(a: Int, b: Int){ Log.e("Atiar", "Sum of a & b: ${a+b}") }
-
创建
if-else
来运行该函数if (verifyNumberOnClick.value){ makeSum(5,6) verifyNumberOnClick.value = false }
-
完成。现在是时候将
verifyNumberOnClick
的值更改为true
了。
从任何地方,你将使它为真,你的函数将被调用。意味着你可以在任何地方执行onclick任务。
作为示例,您可以在单击按钮时更改verifyNumberOnClick
的值。
Button(
onClick = {verifyNumberOnClick.value = false}
) {
Text(text = "Button")
}