跳转到内容

NavigationBar

NavigationBar 是 Miuix 中的底部导航栏组件,用于在应用底部创建导航菜单,支持 2 到 5 个导航项,每个导航项包含图标和文本标签。

FloatingNavigationBar 是一个悬浮样式的底部导航栏组件,同样支持 2 到 5 个导航项,提供不同的显示模式(仅图标、仅文本、图标和文本)。

这些组件通常与 Scaffold 组件结合使用,以便在应用程序的不同页面中保持一致的布局和行为。

引入

kotlin
import top.yukonga.miuix.kmp.basic.NavigationBar
import top.yukonga.miuix.kmp.basic.FloatingNavigationBar
import top.yukonga.miuix.kmp.basic.FloatingNavigationBarMode
import top.yukonga.miuix.kmp.basic.NavigationItem

基本用法

NavigationBar 组件可用于创建固定在底部的导航菜单,:

kotlin
val items = listOf(
    NavigationItem("首页", MiuixIcons.Useful.NavigatorSwitch),
    NavigationItem("我的", MiuixIcons.Useful.Personal),
    NavigationItem("设置", MiuixIcons.Useful.Settings)
)
var selectedIndex by remember { mutableStateOf(0) }

Scaffold(
    bottomBar = {
        NavigationBar(
            items = items,
            selected = selectedIndex,
            onClick = { selectedIndex = it }
        )
    }
)

FloatingNavigationBar

FloatingNavigationBar 组件可用于创建悬浮在底部的导航菜单:

kotlin
val items = listOf(
    NavigationItem("首页", MiuixIcons.Useful.NavigatorSwitch),
    NavigationItem("我的", MiuixIcons.Useful.Personal),
    NavigationItem("设置", MiuixIcons.Useful.Settings)
)
var selectedIndex by remember { mutableStateOf(0) }

Scaffold(
    bottomBar = {
        FloatingNavigationBar(
            items = items,
            selected = selectedIndex,
            onClick = { selectedIndex = it },
            mode = FloatingNavigationBarMode.IconOnly // 仅显示图标
        )
    }
)

组件状态

选中状态

NavigationBarFloatingNavigationBar 都会自动处理选中项的视觉样式,选中项将显示粗体文本并高亮图标/文本。

属性

属性名类型说明默认值是否必须
itemsList<NavigationItem>导航项列表 (2-5 项)-
selectedInt当前选中项的索引-
onClick(Int) -> Unit点击导航项时的回调-
modifierModifier应用于导航栏的修饰符Modifier
colorColor导航栏背景颜色MiuixTheme.colorScheme.surfaceContainer
showDividerBoolean是否显示顶部分割线true
defaultWindowInsetsPaddingBoolean是否应用默认窗口嵌入边距true

FloatingNavigationBar 属性

属性名类型说明默认值是否必须
itemsList<NavigationItem>导航项列表 (2-5 项)-
selectedInt当前选中项的索引-
onClick(Int) -> Unit点击导航项时的回调-
modifierModifier应用于导航栏的修饰符Modifier
colorColor导航栏背景颜色MiuixTheme.colorScheme.surfaceContainer
cornerRadiusDp导航栏的圆角半径FloatingToolbarDefaults.CornerRadius
horizontalAlignmentAlignment.Horizontal导航栏在其父容器中的水平对齐方式CenterHorizontally
horizontalOutSidePaddingDp导航栏外部的水平内边距36.dp
shadowElevationDp导航栏的阴影高度1.dp
showDividerBoolean是否显示导航栏周围的分割线false
defaultWindowInsetsPaddingBoolean是否应用默认窗口嵌入边距true
modeFloatingNavigationBarMode导航项的显示模式(图标/文本/两者)FloatingNavigationBarMode.IconOnly
属性名类型说明默认值是否必须
labelString导航项的文本标签-
iconImageVector导航项的图标-

FloatingNavigationBarMode 枚举

说明
IconAndText显示图标和文本
IconOnly仅显示图标
TextOnly仅显示文本

进阶用法

自定义颜色

kotlin
val items = listOf(
    NavigationItem("首页", MiuixIcons.Useful.NavigatorSwitch),
    NavigationItem("我的", MiuixIcons.Useful.Personal),
    NavigationItem("设置", MiuixIcons.Useful.Settings)
)
var selectedIndex by remember { mutableStateOf(0) }

NavigationBar(
    items = items,
    selected = selectedIndex,
    onClick = { selectedIndex = it },
    color = Color.Red.copy(alpha = 0.3f)
)

无分割线

kotlin
val items = listOf(
    NavigationItem("首页", MiuixIcons.Useful.NavigatorSwitch),
    NavigationItem("我的", MiuixIcons.Useful.Personal),
    NavigationItem("设置", MiuixIcons.Useful.Settings)
)
var selectedIndex by remember { mutableStateOf(0) }

NavigationBar(
    items = items,
    selected = selectedIndex,
    onClick = { selectedIndex = it },
    showDivider = false
)

处理窗口边距

kotlin
val items = listOf(
    NavigationItem("首页", MiuixIcons.Useful.NavigatorSwitch),
    NavigationItem("我的", MiuixIcons.Useful.Personal),
    NavigationItem("设置", MiuixIcons.Useful.Settings)
)
var selectedIndex by remember { mutableStateOf(0) }

NavigationBar(
    items = items,
    selected = selectedIndex,
    onClick = { selectedIndex = it },
    defaultWindowInsetsPadding = false // 自行处理窗口嵌入边距
)

FloatingNavigationBar

自定义模式(图标和文本)

kotlin
val items = listOf(
    NavigationItem("首页", MiuixIcons.Useful.NavigatorSwitch),
    NavigationItem("我的", MiuixIcons.Useful.Personal),
    NavigationItem("设置", MiuixIcons.Useful.Settings)
)
var selectedIndex by remember { mutableStateOf(0) }

FloatingNavigationBar(
    items = items,
    selected = selectedIndex,
    onClick = { selectedIndex = it },
    mode = FloatingNavigationBarMode.IconAndText
)

自定义模式(仅文本)

kotlin
val items = listOf(
    NavigationItem("首页", MiuixIcons.Useful.NavigatorSwitch),
    NavigationItem("我的", MiuixIcons.Useful.Personal),
    NavigationItem("设置", MiuixIcons.Useful.Settings)
)
var selectedIndex by remember { mutableStateOf(0) }

FloatingNavigationBar(
    items = items,
    selected = selectedIndex,
    onClick = { selectedIndex = it },
    mode = FloatingNavigationBarMode.TextOnly
)

自定义颜色和圆角

kotlin
val items = listOf(
    NavigationItem("首页", MiuixIcons.Useful.NavigatorSwitch),
    NavigationItem("我的", MiuixIcons.Useful.Personal),
    NavigationItem("设置", MiuixIcons.Useful.Settings)
)
var selectedIndex by remember { mutableStateOf(0) }

FloatingNavigationBar(
    items = items,
    selected = selectedIndex,
    onClick = { selectedIndex = it },
    color = MiuixTheme.colorScheme.primaryContainer,
    cornerRadius = 28.dp,
    mode = FloatingNavigationBarMode.IconAndText
)

自定义对齐和边距

kotlin
val items = listOf(
    NavigationItem("首页", MiuixIcons.Useful.NavigatorSwitch),
    NavigationItem("我的", MiuixIcons.Useful.Personal),
    NavigationItem("设置", MiuixIcons.Useful.Settings)
)
var selectedIndex by remember { mutableStateOf(0) }

FloatingNavigationBar(
    items = items,
    selected = selectedIndex,
    onClick = { selectedIndex = it },
    horizontalAlignment = Alignment.Start, // 左对齐
    horizontalOutSidePadding = 16.dp, // 设置外部边距
    mode = FloatingNavigationBarMode.IconOnly
)

结合页面切换使用(使用脚手架)

使用 NavigationBar

kotlin
val pages = listOf("首页", "我的", "设置")
val items = listOf(
    NavigationItem("首页", MiuixIcons.Useful.NavigatorSwitch),
    NavigationItem("我的", MiuixIcons.Useful.Personal),
    NavigationItem("设置", MiuixIcons.Useful.Settings)
)
var selectedIndex by remember { mutableStateOf(0) }

Scaffold(
    bottomBar = {
        NavigationBar(
            items = items,
            selected = selectedIndex,
            onClick = { selectedIndex = it }
        )
    }
) { paddingValues ->
    // 内容区域需要考虑 padding
    Box(
        modifier = Modifier
            .fillMaxSize()
            .padding(paddingValues),
        contentAlignment = Alignment.Center
    ) {
        Text(
            text = "当前页面:${pages[selectedIndex]}",
            style = MiuixTheme.textStyles.title1
        )
    }
}

使用 FloatingNavigationBar

kotlin
val pages = listOf("首页", "我的", "设置")
val items = listOf(
    NavigationItem("首页", MiuixIcons.Useful.NavigatorSwitch),
    NavigationItem("我的", MiuixIcons.Useful.Personal),
    NavigationItem("设置", MiuixIcons.Useful.Settings)
)
var selectedIndex by remember { mutableStateOf(0) }

Scaffold(
    bottomBar = {
        FloatingNavigationBar(
            items = items,
            selected = selectedIndex,
            onClick = { selectedIndex = it },
            mode = FloatingNavigationBarMode.IconOnly // 仅显示图标
        )
    }
) { paddingValues ->
    // 内容区域需要考虑 padding
    Box(
        modifier = Modifier
            .fillMaxSize()
            .padding(paddingValues),
        contentAlignment = Alignment.Center
    ) {
        Text(
            text = "当前页面:${pages[selectedIndex]}",
            style = MiuixTheme.textStyles.title1
        )
    }
}

基于 Apache-2.0 许可发布