Compose Modifier

contentReceiver

Configures the current node and any children nodes as a Content Receiver.

ReceiveContentFullSample

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun ReceiveContentFullSample() {
    val state = rememberTextFieldState()
    var images by remember { mutableStateOf<List<ImageBitmap>>(emptyList()) }
    var dragging by remember { mutableStateOf(false) }
    var hovering by remember { mutableStateOf(false) }
    Column {
        Row { images.forEach { Image(bitmap = it, contentDescription = null) } }
        // Note that only TextFieldState override of the text field supports contentReceiver
        BasicTextField(
            state = state,
            modifier =
                Modifier.background(
                        when {
                            dragging -> Color.Red
                            hovering -> Color.Green
                            else -> MaterialTheme.colors.background
                        }
                    )
                    .contentReceiver(
                        receiveContentListener =
                            object : ReceiveContentListener {
                                override fun onDragStart() {
                                    dragging = true
                                }
                                override fun onDragEnd() {
                                    hovering = false
                                    dragging = false
                                }
                                override fun onDragEnter() {
                                    hovering = true
                                }
                                override fun onDragExit() {
                                    hovering = false
                                }
                                override fun onReceive(
                                    transferableContent: TransferableContent
                                ): TransferableContent? {
                                    if (!transferableContent.hasMediaType(MediaType.Image)) {
                                        return transferableContent
                                    }
                                    val newImages = mutableListOf<ImageBitmap>()
                                    return transferableContent
                                        .consume { item ->
                                            // only consume this item if we can read an imageBitmap
                                            item.readImageBitmap()?.let {
                                                newImages += it
                                                true
                                            } ?: false
                                        }
                                        .also { images = newImages }
                                }
                            }
                    ),
        )
    }
}