Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to replace multiple lambda () -> Unit in a composable in Jetpack compose android

How to replace multiple lambda () -> Unit in a composable in Jetpack compose android

 @Composable fun ChatMessageDisplay (
    authorName: String,
    author ImageUrl: String,
    dateSent: String,
    messages: List<Content>,
    likeCounts: List<Int>,
    onLikeClick: (Int) -> Unit,
    onMessageClick: (Int) -> Unit,
    onMessageLongClick: (Int) -> Unit,
    onUserPhotoClick: () -> Unit,
    onVisibleOnScreen: (Int) -> Unit,
    onShareClick: (Int) -> Unit,
    onEditClick: (Int) -> Unit,
    )

I have above composable Which requires multiple lambda () -> Unit

how can we replace them with a single lambda () -> Unit or any simple method to reduce multiple lambda () -> Units

like image 499
1234567 Avatar asked Jun 23 '26 22:06

1234567


1 Answers

You can use a single lambda that takes a sealed class or an enum as its parameter

Here

sealed class ChatMessageEvent {
    data class LikeClick(val messageId: Int) : ChatMessageEvent()
    data class MessageClick(val messageId: Int) : ChatMessageEvent()
    data class MessageLongClick(val messageId: Int) : ChatMessageEvent()
    data object UserPhotoClick : ChatMessageEvent()
    data class VisibleOnScreen(val messageId: Int) : ChatMessageEvent()
    data class ShareClick(val messageId: Int) : ChatMessageEvent()
    data class EditClick(val messageId: Int) : ChatMessageEvent()
}

Then modify ChatMessageDisplay composable to take a single lambda parameter that accepts a ChatMessageEvent

@Composable
fun ChatMessageDisplay(
    authorName: String,
    authorImageUrl: String,
    dateSent: String,
    messages: List<Content>,
    likeCounts: List<Int>,
    onEvent: (ChatMessageEvent) -> Unit
) {
    // Implementation where you call onEvent with the appropriate event
    // For example, for a like click:
    // IconButton(onClick = { onEvent(ChatMessageEvent.LikeClick(messageId)) })
}

Then you can handle the event in the caller

ChatMessageDisplay(
    authorName = "ME",
    authorImageUrl = "url_to_image",
    dateSent = "2024-02-26",
    messages = emptyList(),
    likeCounts = emptyList(),
    onEvent = { event ->
        when (event) {
            is ChatMessageEvent.LikeClick -> {
                // Handle like click
            }
            is ChatMessageEvent.MessageClick -> {
                // Handle message click
            }
            is ChatMessageEvent.MessageLongClick -> {
                // Handle message long click
            }
            is ChatMessageEvent.UserPhotoClick -> {
                // Handle user photo click
            }
            is ChatMessageEvent.VisibleOnScreen -> {
                // Handle visible on screen
            }
            is ChatMessageEvent.ShareClick -> {
                // Handle share click
            }
            is ChatMessageEvent.EditClick -> {
                // Handle edit click
            }
        }
    }
)
like image 143
Yakubu Avatar answered Jun 25 '26 12:06

Yakubu



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!