跳转到内容

WindowBottomSheet

WindowBottomSheet 是窗口级的底部抽屉组件。它使用平台 Dialog 渲染,不依赖 ScaffoldCOUIPopupHost。支持大屏优化的动效、系统返回手势关闭,以及在内容内部通过组合局部请求关闭。

提示

该组件不依赖 Scaffold,可在任意 Composable 作用域中使用。

引入

kotlin
import io.github.suqi8.coui.kmp.window.WindowBottomSheet
import io.github.suqi8.coui.kmp.theme.LocalDismissState

基本用法

WindowBottomSheet 组件提供了基础的底部抽屉功能:

kotlin
var showBottomSheet by remember { mutableStateOf(false) }

// Can be used anywhere
TextButton(
    text = "Show Window Bottom Sheet",
    onClick = { showBottomSheet = true }
)

WindowBottomSheet(
    show = showBottomSheet,
    title = "Window Bottom Sheet Title",
    onDismissRequest = { showBottomSheet = false }
) {
    val dismiss = LocalDismissState.current
    Text(text = "This is the content of the window bottom sheet")
    TextButton(
        text = "Close",
        onClick = { dismiss?.invoke() }
    )
}

属性

WindowBottomSheet 属性

属性名类型说明默认值是否必须
showBoolean是否显示底部抽屉-
modifierModifier应用于底部抽屉的修饰符Modifier
titleString?底部抽屉的标题null
startAction@Composable (() -> Unit)?可选的左侧操作按钮(例如关闭按钮)null
endAction@Composable (() -> Unit)?可选的右侧操作按钮(例如提交按钮)null
backgroundColorColor底部抽屉背景色BottomSheetDefaults.backgroundColor()
enableWindowDimBoolean是否启用遮罩层true
cornerRadiusDp顶部圆角半径BottomSheetDefaults.cornerRadius
sheetMaxWidthDp底部抽屉的最大宽度BottomSheetDefaults.maxWidth
onDismissRequest(() -> Unit)?当用户请求关闭(点击遮罩层或返回手势)时触发null
onDismissFinished(() -> Unit)?关闭动画完成后调用;若关闭过程被中途取消(例如 show 被设回 true),则不会触发null
outsideMarginDpSize底部抽屉外部边距BottomSheetDefaults.outsideMargin
insideMarginDpSize底部抽屉内部内容的边距BottomSheetDefaults.insideMargin
defaultWindowInsetsPaddingBoolean是否应用默认窗口插入内边距true
dragHandleColorColor拖拽指示器的颜色BottomSheetDefaults.dragHandleColor()
allowDismissBoolean是否允许通过拖拽或返回手势关闭抽屉true
enableNestedScrollBoolean是否允许内容嵌套滚动true
content@Composable () -> Unit底部抽屉的内容-

BottomSheetDefaults 对象

BottomSheetDefaults 对象为底部抽屉组件提供默认设置。

BottomSheetDefaults 属性

属性名类型说明
cornerRadiusDp默认圆角半径 (20.dp,COUI couiRoundCornerXL)
maxWidthDp默认宽度上限 (Dp.Infinity,实际宽度由 COUI 响应式栅格决定)
outsideMarginDpSize底部抽屉外部默认边距
insideMarginDpSize底部抽屉内部默认边距

BottomSheetDefaults 函数

函数名返回类型说明
backgroundColor()Color获取默认背景颜色
dragHandleColor()Color获取默认拖拽指示器颜色

进阶用法

头部操作按钮

使用 startActionendAction 在头部区域放置操作按钮。LocalDismissState 会同时提供给两个操作插槽和内容插槽:

kotlin
var showBottomSheet by remember { mutableStateOf(false) }

WindowBottomSheet(
    show = showBottomSheet,
    title = "Action Sheet",
    startAction = {
        val dismiss = LocalDismissState.current
        TextButton(
            text = "Cancel",
            onClick = { dismiss?.invoke() }
        )
    },
    endAction = {
        val dismiss = LocalDismissState.current
        TextButton(
            text = "Confirm",
            onClick = { dismiss?.invoke() }
        )
    },
    onDismissRequest = { showBottomSheet = false }
) {
    Text("Content with header action buttons")
}

从内容中关闭

您可以使用 LocalDismissState 从其内容中关闭底部抽屉:

kotlin
WindowBottomSheet(
    show = showBottomSheet,
    title = "Dismiss Example",
    onDismissRequest = { showBottomSheet = false }
) {
    val dismiss = LocalDismissState.current

    TextButton(
        text = "Close Bottom Sheet",
        onClick = { dismiss?.invoke() }
    )
}

禁止手势关闭

设置 allowDismiss = false 可忽略下拉拖拽与返回手势关闭,此时抽屉只能通过代码关闭:

kotlin
var showBottomSheet by remember { mutableStateOf(false) }

WindowBottomSheet(
    show = showBottomSheet,
    title = "Processing",
    allowDismiss = false, // drag and back gesture will not dismiss the sheet
    onDismissRequest = { showBottomSheet = false }
) {
    Text("This sheet can only be closed programmatically")
    TextButton(
        text = "Done",
        onClick = { showBottomSheet = false }
    )
}

变更日志

基于 Apache-2.0 许可发布