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

能否用Dropdown Menu作导航?DropdownMenuItem报未解析引用错误

Compose DropdownMenuItem onClick 出现“未解析引用”错误的解决方案

问题原因

你在TopAppBarDropdownMenu组件的第二个DropdownMenuItem里调用了onNavigatePagina2(),但这个函数既没在TopAppBarDropdownMenu的参数里定义,也没在该组件的作用域内声明,编译器找不到这个函数,所以报“未解析引用”错误。

解决步骤

1. 给TopAppBarDropdownMenu添加导航回调参数

修改组件定义,把需要的导航函数作为参数传入:

@Composable
fun TopAppBarDropdownMenu(
    onNavigatePagina2: () -> Unit // 新增导航回调参数
) {
    val expanded = remember { mutableStateOf(false) }
    
    Box(
        Modifier
            .wrapContentSize(Alignment.TopEnd)
    ) {
        IconButton(
            onClick = {
                expanded.value = true
            }
        ) {
            Icon(
                Icons.Filled.Menu,
                contentDescription = "Menu"
            )
        }
    }

    DropdownMenu(
        expanded = expanded.value,
        onDismissRequest = { expanded.value = false}
    ) {
        DropdownMenuItem(
            text = {
                Text(text = stringResource(R.string.pagina_1))
            },
            onClick = {
                expanded.value = false
            }
        )

        Divider()

        DropdownMenuItem(
            text = {
                Text(text = stringResource(R.string.pagina_2))
            },
            onClick = {
                onNavigatePagina2() // 现在可正常调用
                expanded.value = false
            }
        )
    }
}

2. 让PresentTestAppBar接收并传递导航回调

假设PresentTestAppBar是包裹TopAppBarDropdownMenu的顶部栏组件,修改它的参数并传递导航逻辑:

@Composable
fun PresentTestAppBar(
    currentScreen: Pagina,
    onNavigatePagina2: () -> Unit // 新增参数
) {
    TopAppBar(
        title = { Text(currentScreen.name) },
        actions = {
            // 把导航回调传给下拉菜单组件
            TopAppBarDropdownMenu(onNavigatePagina2 = onNavigatePagina2)
        }
    )
}

3. 在PresentTest中传递具体导航逻辑

回到主组件,把navController的导航逻辑传给顶部栏:

@Composable
fun PresentTest(
    navController: NavHostController = rememberNavController()
) {
    val backStackEntry by navController.currentBackStackEntryAsState()
    val currentScreen = Pagina.valueOf(
        backStackEntry?.destination?.route ?: Pagina.Pagina1.name
    )
    Scaffold(
        topBar = {
            PresentTestAppBar(
                currentScreen = currentScreen,
                // 传递跳转到Pagina2的具体逻辑
                onNavigatePagina2 = { navController.navigate(Pagina.Pagina2.name) }
            )
        }
    ) { innerPadding ->
        NavHost(
            navController = navController,
            startDestination = Pagina.Pagina1.name,
            modifier = Modifier.padding(innerPadding)
        ) {
            composable(route = Pagina.Pagina1.name) {
                Pagina1Screen(
                    onNavigatePagina2 = {
                        navController.navigate(Pagina.Pagina2.name)
                    }
                )
            }
            composable(route = Pagina.Pagina2.name) {
                Pagina2Screen(
                    onNavigatePagina1 = {
                        navController.navigate(Pagina.Pagina1.name)
                    }
                )
            }
        }
    }
}

如果后续需要给Pagina1也添加下拉菜单跳转,用同样的方式新增onNavigatePagina1参数即可,保持组件之间的解耦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:01:09