You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过UseCaseState从CalendarSample2组件获取选中日期?

问题解决:将CalendarDialog选中日期传递给父组件

问题分析

你当前的CalendarSample2组件内部维护了selectedDate状态,且closeSelection回调仅接收UseCaseState.() -> Unit类型,无法携带选中的日期数据回传给父组件。要实现需求,需要将状态提升到父组件,并调整回调逻辑来传递选中值。

解决方案

1. 调整子组件:接收父组件的状态与带参数的回调

修改CalendarSample2,让它接收父组件传来的selectedDate状态,以及能接收选中日期的回调函数:

@ExperimentalMaterial3Api
@Composable
internal fun CalendarSample2(
    selectedDate: MutableState<LocalDate?>,
    closeSelection: (UseCaseState, LocalDate?) -> Unit // 调整回调,携带选中日期
) {
    CalendarDialog(
        state = rememberUseCaseState(
            visible = true,
            onCloseRequest = { useCaseState ->
                closeSelection(useCaseState, selectedDate.value) // 关闭时传递选中日期
            }
        ),
        config = CalendarConfig(
            yearSelection = true,
            style = CalendarStyle.WEEK,
        ),
        selection = CalendarSelection.Date(
            selectedDate = selectedDate.value
        ) { newDate ->
            selectedDate.value = newDate // 直接更新父组件传来的状态
        },
    )
}

2. 父组件调用:维护状态并接收回调值

在父组件中维护selectedDate状态,调用CalendarSample2时传入状态和回调,即可拿到选中的日期:

@ExperimentalMaterial3Api
@Composable
fun ParentComponent() {
    val selectedDate = remember { mutableStateOf<LocalDate?>(LocalDate.now().minusDays(3)) }

    // 调用CalendarSample2
    CalendarSample2(
        selectedDate = selectedDate,
        closeSelection = { useCaseState, date ->
            // 在这里拿到选中的date,做后续处理
            useCaseState.hide() // 执行关闭逻辑
            println("选中的日期:$date")
        }
    )
}

替代方案:保持原回调类型,通过扩展属性传递值

如果你想保留UseCaseState.() -> Unit的回调类型,可以通过给UseCaseState添加扩展属性来携带日期:

// 扩展UseCaseState,添加可选的selectedDate属性
var UseCaseState.selectedDate: LocalDate? by Delegates.notNull()

@ExperimentalMaterial3Api
@Composable
internal fun CalendarSample2(
    selectedDate: MutableState<LocalDate?>,
    closeSelection: UseCaseState.() -> Unit
) {
    CalendarDialog(
        state = rememberUseCaseState(
            visible = true,
            onCloseRequest = { useCaseState ->
                useCaseState.selectedDate = selectedDate.value
                closeSelection(useCaseState)
            }
        ),
        config = CalendarConfig(
            yearSelection = true,
            style = CalendarStyle.WEEK,
        ),
        selection = CalendarSelection.Date(
            selectedDate = selectedDate.value
        ) { newDate ->
            selectedDate.value = newDate
        },
    )
}

// 父组件调用
@ExperimentalMaterial3Api
@Composable
fun ParentComponent() {
    val selectedDate = remember { mutableStateOf<LocalDate?>(LocalDate.now().minusDays(3)) }

    CalendarSample2(
        selectedDate = selectedDate,
        closeSelection = {
            val selected = this.selectedDate // 通过this获取携带的日期
            this.hide()
            println("选中的日期:$selected")
        }
    )
}

内容的提问来源于stack exchange,提问作者AstroBoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:53:26