跳转到内容

NavigationRail

NavigationRail 是 Miuix 中的侧边导航组件,适用于宽屏设备。项目以「图标在上、文字在下」的形式展示,并可通过 NavigationRailState 展开为「图标 + 文字」横排的宽布局。

引入

kotlin
import top.yukonga.miuix.kmp.basic.NavigationRail
import top.yukonga.miuix.kmp.basic.NavigationRailItem
import top.yukonga.miuix.kmp.basic.rememberNavigationRailState

基本用法

NavigationRail 组件可用于创建侧边导航菜单:

kotlin
var selectedIndex by remember { mutableStateOf(0) }
val items = listOf("主页", "个人", "设置")
val icons = listOf(MiuixIcons.VerticalSplit, MiuixIcons.Contacts, MiuixIcons.Settings)

Row {
    NavigationRail {
        items.forEachIndexed { index, label ->
            NavigationRailItem(
                selected = selectedIndex == index,
                onClick = { selectedIndex = index },
                icon = icons[index],
                label = label
            )
        }
    }
    // 内容区域
}

可展开导航栏

传入一个 NavigationRailState(通过 rememberNavigationRailState 创建)即可让导航栏支持展开/收起。导航栏左上角会显示一个内建的切换按钮,点击后导航栏会在收起宽度与 expandedWidth 之间做动画切换。展开后,每个项目会变为「图标 + 文字」横排布局,并在选中项后方绘制高亮药丸。

kotlin
var selectedIndex by remember { mutableStateOf(0) }
val items = listOf("主页", "个人", "设置")
val icons = listOf(MiuixIcons.VerticalSplit, MiuixIcons.Contacts, MiuixIcons.Settings)
val railState = rememberNavigationRailState()

Row {
    NavigationRail(state = railState) {
        items.forEachIndexed { index, label ->
            NavigationRailItem(
                selected = selectedIndex == index,
                onClick = { selectedIndex = index },
                icon = icons[index],
                label = label
            )
        }
    }
    // 内容区域
}

你也可以通过 railState.expand()railState.collapse()railState.toggle() 以编程方式控制状态。当 state 保持为 null(默认值)时,导航栏保持经典的不可展开布局,且不显示切换按钮。

属性

属性名类型说明默认值是否必须
modifierModifier应用于 NavigationRail 的修饰符Modifier
stateNavigationRailState?展开/收起状态;非空时导航栏可展开null
header@Composable (ColumnScope.() -> Unit)?头部内容(通常是 FAB 或 Logo)null
colorColorNavigationRail 的背景颜色MiuixTheme.colorScheme.surface
showDividerBoolean是否在 NavigationRail 和内容之间显示分割线true
defaultWindowInsetsPaddingBoolean是否对 NavigationRail 应用默认的窗口边距true
minWidthDpNavigationRail 收起时的最小宽度NavigationRailDefaults.MinWidth
expandedWidthDpNavigationRail 展开时的宽度NavigationRailDefaults.ExpandedWidth
expandContentDescriptionString收起状态下切换按钮的无障碍描述NavigationRailDefaults.ExpandContentDescription
collapseContentDescriptionString展开状态下切换按钮的无障碍描述NavigationRailDefaults.CollapseContentDescription
scrollStateScrollState内容列的滚动状态rememberScrollState()
content@Composable ColumnScope.()NavigationRail 的内容-
属性名类型说明默认值是否必须
selectedBoolean是否选中-
onClick() -> Unit点击时的回调-
iconImageVector该项的图标-
labelString该项的标签文本-
modifierModifier应用于 NavigationRailItem 的修饰符Modifier
enabledBoolean是否启用该项true
badge(@Composable () -> Unit)?显示在该项图标上的可选徽章,通常是一个 Badgenull

NavigationRailDefaults 对象提供了 NavigationRail 和 NavigationRailItem 组件的默认值。

常量

常量名类型说明默认值
MinWidthDp导航栏收起时的最小宽度80.dp
ExpandedWidthDp导航栏展开时的宽度240.dp
VerticalPaddingDp内容垂直内边距24.dp
HeaderSpacingDp头部后的间距24.dp
IconSizeDp图标尺寸28.dp
IconTextSpacingDp图标与文字间距4.dp
ItemVerticalPaddingDp每个项目的垂直内边距12.dp
LabelFontSizeTextUnit标签字号12.sp
ExpandedLabelFontSizeTextUnit展开时的标签字号16.sp
ExpandedItemHorizontalMarginDp展开项与边缘之间的外边距12.dp
ExpandedItemCornerRadiusDp选中药丸的圆角半径16.dp
CollapsedIndicatorVerticalPaddingDp收起项指示器围绕图标的内边距4.dp
ExpandedItemContentHorizontalPaddingDp展开项内部的水平内边距14.dp
ExpandedItemContentVerticalPaddingDp展开项内部的垂直内边距14.dp
ExpandedItemIconTextSpacingDp展开项图标与文字间距16.dp
ExpandContentDescriptionString收起时切换按钮的无障碍描述"Expand navigation rail"
CollapseContentDescriptionString展开时切换按钮的无障碍描述"Collapse navigation rail"

通过 rememberNavigationRailState(initialValue) 创建,并传入 NavigationRail 以让导航栏支持展开/收起。

成员类型说明
currentValueNavigationRailValue当前的展开状态值
isExpandedBoolean导航栏当前是否处于展开状态
expand()fun展开导航栏
collapse()fun收起导航栏
toggle()fun在收起与展开之间切换
描述
Collapsed导航栏收起到 MinWidth
Expanded导航栏展开到 ExpandedWidth

变更日志

基于 Apache-2.0 许可发布