android - 可组合项因传递的回调过多而变得臃肿

标签 android kotlin android-jetpack-compose

这是我当前的可组合项:

@Composable
fun MyComposable(
    onPress1: () -> Unit,
    onPress2: () -> Unit,
    onPress3: () -> Unit,
    onPress4: () -> Unit,
    onPress5: () -> Unit,
) {
    Button(onClick = onPress1) { Text(text = "Press 1")}
    Button(onClick = onPress2) { Text(text = "Press 2")}
    Button(onClick = onPress3) { Text(text = "Press 3")}
    Button(onClick = onPress4) { Text(text = "Press 4")}
    Button(onClick = onPress5) { Text(text = "Press 5")}
}

有没有办法减少这种情况,类似于react如何使用useReducer钩子(Hook)操作类型和操作负载

最佳答案

您可以使用密封类来创建可根据需要在项目中的不同位置重用的点击事件。

// Create your different click events
sealed class MyClickEvent {
    object Press1: MyClickEvent()
    object Press2: MyClickEvent()
    object Press3: MyClickEvent()
    object Press4: MyClickEvent()
    // You can create a click event that passes arguments
    data class Press5(val arg: String): MyClickEvent()
}

// Handle each click event ( This function should be inside your view model )
fun onMyClickEvent(event: MyClickEvent) {
    when(event) {
        is MyClickEvent.Press1 -> println("Press1")
        is MyClickEvent.Press2 -> println("Press2")
        is MyClickEvent.Press3 -> println("Press3")
        is MyClickEvent.Press4 -> println("Press4")
        is MyClickEvent.Press5 -> println("Press5: ${event.arg}")
    }
}

@Composable
fun MyMainComposable() {
    MyComposable(
        onMyClickEvent = { event -> onMyClickEvent(event) }
    )
}

// Pass only single lambda for different click events
@Composable
fun MyComposable(
    onMyClickEvent: (event: MyClickEvent) -> Unit,
) {
    Button(onClick = { onMyClickEvent(MyClickEvent.Press1) }) {
        Text(text = "Press 1")
    }
    Button(onClick = { onMyClickEvent(MyClickEvent.Press2) }) {
        Text(text = "Press 2")
    }
    Button(onClick = { onMyClickEvent(MyClickEvent.Press3) }) {
        Text(text = "Press 3")
    }
    Button(onClick = { onMyClickEvent(MyClickEvent.Press4) }) {
        Text(text = "Press 4")
    }
    Button(onClick = { onMyClickEvent(MyClickEvent.Press5(arg = "data")) }) {
        Text(text = "Press 5")
    }
}

关于android - 可组合项因传递的回调过多而变得臃肿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74543084/

相关文章:

android - 在 Jetpack Compose 中,我可以将动画配置为以恒定速度而不是恒定时间运行吗?

android - 将 jetpack compose 添加到现有项目

java - 所选值保留保存在带有单选按钮 Android 的 Dialogfragment 中

android - 仅包含 fragment 的主/细流

Android picasso 缓存数据

java - 将变量传递给 catch - Java

android - Android compileTarget P appcompat库

java - 如何更有效地通过 http 下载大文件?

android - 如何在 Jetpack compose 中创建圆角 BottomDrawer(又名 Modal Bottom Sheet)

android - OAuth2 Client Id 和 Client Secret 的安全性