Compose 可组合项 - 抽屉式导航栏 Drawer

官方介绍

参考文章

一、概念

Scafford 在 material 包下可以设置 drawerContent,在 material3 包下已经没有。

PermanentNavigationDrawer 抽屉栏永久显示,占用屏幕。
ModalNavigationDrawer 抽屉栏打开时覆盖在屏幕上。
DismissibleNavigationDrawer 抽屉栏打开会连带把屏幕也向右移动。

二、使用

@Composable
fun ModalNavigationDrawer(
    drawerContent: @Composable () -> Unit,        //抽屉内容
    modifier: Modifier = Modifier,
    drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed),        //控制打开关闭
    gesturesEnabled: Boolean = true,        //是否响应手势在屏幕上滑动来打开关闭
    scrimColor: Color = DrawerDefaults.scrimColor,
    content: @Composable () -> Unit        //屏幕内容

@Composable
fun NavigationDrawerItem(
    label: @Composable () -> Unit,        //名称
    selected: Boolean,        //是否选中
    onClick: () -> Unit,        //点击回调
    modifier: Modifier = Modifier,
    icon: (@Composable () -> Unit)? = null,        //图标
    badge: (@Composable () -> Unit)? = null,
    shape: Shape = NavigationDrawerTokens.ActiveIndicatorShape.toShape(),        //形状
    colors: NavigationDrawerItemColors = NavigationDrawerItemDefaults.colors(),        //颜色
    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
)

material3 提供的 Item 组件,一般不会用它,都是用自定义的。

val drawerState = rememberDrawerState(DrawerValue.Closed)
var selectedItemIndex by remember { mutableStateOf(0) }    //当前选中的索引(不需要做条目按钮状态可忽略)
ModalNavigationDrawer(
    drawerState = drawerState,
    //抽屉内容
    drawerContent = {
        Drawer(
            selectedItemIndex = selectedItemIndex,
            onSelectedIndexChange = { selectedItemIndex = it },
            closeDrawer = {
                //延迟抽屉关闭,先等Navigation切换时加载一下,效果更好
                coroutineScope.launch {
                    delay(500)
                    drawerState.close()
                }
            }
        )
    }
) {
    //屏幕内容
}

@Composable
private fun Drawer(
    selectedItemIndex: Int,
    onSelectedIndexChange: (Int) -> Unit,
    closeDrawer: () -> Unit,
) {
    ...
    dataList.forEachIndex { item, index ->
        DrawerItem(
            isSelected = index == selectedItemIndex ,
            onClick = {
                onSelectedIndexChange(index)
                closeDrawer()
            }
        )
    }
}

//抽屉条目
@Composable
private fun DrawerItem(
    title: String,
    @DrawableRes pic: Int,
    isSelected: Boolean,    //不需要做条目按钮状态可忽略
    onClick: () -> Unit
) {...}

相关推荐

  1. Compose 组合 - 抽屉导航 Drawer

    2024-06-18 05:32:03       9 阅读
  2. uniapp导航组件如何使用

    2024-06-18 05:32:03       32 阅读
  3. 使用Vue3写一个抽屉Drawer组件

    2024-06-18 05:32:03       21 阅读
  4. 鸿蒙设置沉浸状态、全屏、获取导航高度

    2024-06-18 05:32:03       117 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 05:32:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 05:32:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 05:32:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 05:32:03       20 阅读

热门阅读

  1. CentOS:安装NodeJs

    2024-06-18 05:32:03       5 阅读
  2. 家庭教育孩子的十大方法!家长一定要知道

    2024-06-18 05:32:03       10 阅读
  3. 反悔贪心,LeetCode 2813. 子序列最大优雅度

    2024-06-18 05:32:03       10 阅读
  4. MCU嵌入式AI开发笔记-视频笔记同步更新

    2024-06-18 05:32:03       9 阅读
  5. Kafka使用教程和案例详解

    2024-06-18 05:32:03       9 阅读
  6. Leetcode 45. 跳跃游戏 II(DP 双指针)

    2024-06-18 05:32:03       9 阅读
  7. 第九章 Three.js 高级材质与着色器 (一)

    2024-06-18 05:32:03       7 阅读