如何以编程方式单击Jetpack Compose中的按钮?



对于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()
}

一个非常简单的解决方案。

  1. 创建状态变量

    val verifyNumberOnClick = remember { mutableStateOf(false) }
    
  2. 创建一个私有函数,可以作为onClick的动作。

    private fun makeSum(a: Int, b: Int){
    Log.e("Atiar", "Sum of a & b: ${a+b}")
    }
    
  3. 创建if-else来运行该函数

    if (verifyNumberOnClick.value){
    makeSum(5,6)
    verifyNumberOnClick.value = false
    }
    
  4. 完成。现在是时候将verifyNumberOnClick的值更改为true了。

从任何地方,你将使它为真,你的函数将被调用。意味着你可以在任何地方执行onclick任务。

作为示例,您可以在单击按钮时更改verifyNumberOnClick的值。

Button(
onClick = {verifyNumberOnClick.value = false}
) {
Text(text = "Button")
}

相关内容

  • 没有找到相关文章

最新更新