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

如何让Jetpack Compose/Material3的ModalNavigationDrawer可滚动?

在Jetpack Compose/Material3中实现ModalNavigationDrawer的滚动功能

问题场景

在Jetpack Compose/Material3开发中,想要给ModalNavigationDrawer添加滚动功能,尝试在ModalDrawerSheet的内容中使用LazyColumn时,遇到错误提示:@Composable invocations can only happen from the context of a @Composable function

解决方案

以下是可直接编译运行的完整MainActivity代码,通过在ModalDrawerSheet内部嵌套LazyColumn,成功实现了可滚动的抽屉菜单:

package com.example.testnavdrawaer

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.foundation.lazy.items
import androidx.compose.ui.graphics.Color
import com.example.testnavdrawaer.ui.theme.TestNavigationDrawerTheme
import kotlinx.coroutines.launch

class CountdownMenu(index: Int, name: String) {
    var index: Int = index
    var name: String = name
}

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            TestNavigationDrawerTheme {
                MainScreen()
            }
        }
    }
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainScreen() {
    val drawerState = rememberDrawerState(DrawerValue.Closed)
    val scope = rememberCoroutineScope()

    // 示例用的菜单列表
    val menuItems: List<CountdownMenu> = MenuItems()

    val selectedItem: MutableState<CountdownMenu> =
        remember { mutableStateOf(menuItems[0]) }

    ModalNavigationDrawer(
        drawerState = drawerState,
        drawerContent = {
            ModalDrawerSheet(
                drawerContainerColor = MaterialTheme.colorScheme.primary,
                drawerContentColor = MaterialTheme.colorScheme.onPrimaryContainer,
                content = {
                    LazyColumn {
                        items(menuItems) { item ->
                            NavigationDrawerItem(
                                label = { Text(item.name) },
                                selected = item.index == selectedItem.value.index,
                                onClick = {
                                    selectedItem.value = item
                                    scope.launch { drawerState.close() }
                                },
                                colors = NavigationDrawerItemDefaults.colors(
                                    unselectedContainerColor = Color.Transparent,
                                    unselectedTextColor = MaterialTheme.colorScheme.onPrimary,
                                    selectedContainerColor = MaterialTheme.colorScheme.primaryContainer,
                                    selectedTextColor = MaterialTheme.colorScheme.onPrimaryContainer,
                                ),
                                modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding)
                            )
                        }
                    }
                }
            )
        },
        content = {
            Column(
                modifier = Modifier
                    .fillMaxSize()
                    .padding(16.dp),
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                Text(
                    text = if (drawerState.isClosed) ">>> 滑动 >>>" else "<<< 滑动 <<<",
                    color = MaterialTheme.colorScheme.onBackground
                )
                Spacer(Modifier.height(20.dp))
                Button(onClick = { scope.launch { drawerState.open() } }) {
                    Text("点击打开抽屉")
                }
            }
        }
    )
}

fun MenuItems(): List<CountdownMenu> {
    val menuItems = mutableListOf<CountdownMenu>()
    for (i in 1..26) {
        menuItems.add(CountdownMenu(i, "选项 $i"))
    }
    return menuItems
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:52:44