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

Jetpack Compose中Type mismatch错误的原因及解决方法咨询

问题:Type mismatch: inferred type is Unit but () -> Unit was expected

错误场景代码:

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ScaffoldView(isScaffold: ()-> Boolean, selectedScreen: () -> NavItem){
    Scaffold(
        topBar =
            TopAppBar(
                modifier = Modifier.fillMaxWidth(),
                title = {
                    when(selectedScreen().route){
                        Screens.ToDo.name -> PageOne()
                    }
                }
            )
    ) {paddingValues ->
        Box(modifier = Modifier.padding(paddingValues)){

        }
    }
}

调用时传入的变量:

var selectedScreen by remember { mutableStateOf(listOfNavItems.first()) }

错误原因

Scaffold组件的topBar参数要求接收一个@Composable () -> Unit类型的lambda表达式,但你直接调用了TopAppBar(...)——这是直接执行该Composable函数,返回值为Unit,和参数要求的lambda类型不匹配,因此抛出类型错误。

解决方法

1. 修正topBar参数的写法

将TopAppBar包裹在lambda大括号内,符合topBar参数的类型要求:

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ScaffoldView(isScaffold: ()-> Boolean, selectedScreen: () -> NavItem){
    Scaffold(
        topBar = { // 新增lambda大括号
            TopAppBar(
                modifier = Modifier.fillMaxWidth(),
                title = {
                    when(selectedScreen().route){
                        Screens.ToDo.name -> PageOne()
                    }
                }
            )
        }
    ) {paddingValues ->
        Box(modifier = Modifier.padding(paddingValues)){

        }
    }
}

2. 正确传递selectedScreen参数

函数定义中selectedScreen是() -> NavItem类型,调用时需要传入一个lambda返回你的状态变量:

ScaffoldView(
    isScaffold = { /* 此处传入你的isScaffold逻辑 */ },
    selectedScreen = { selectedScreen } // 用lambda返回当前状态值
)

可选优化:调整参数类型(按需)

如果不需要延迟计算的lambda,也可以把ScaffoldView的参数改为直接接收NavItem类型,这样调用时直接传selectedScreen即可,Compose会自动跟踪状态变化触发重组:

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ScaffoldView(isScaffold: ()-> Boolean, selectedScreen: NavItem){ // 修改参数类型
    Scaffold(
        topBar = {
            TopAppBar(
                modifier = Modifier.fillMaxWidth(),
                title = {
                    when(selectedScreen.route){ // 直接调用属性,无需执行lambda
                        Screens.ToDo.name -> PageOne()
                    }
                }
            )
        }
    ) {paddingValues ->
        Box(modifier = Modifier.padding(paddingValues)){

        }
    }
}

// 调用时直接传值
ScaffoldView(
    isScaffold = { /* 你的逻辑 */ },
    selectedScreen = selectedScreen
)

关于lambda传递的性能说明

谷歌推荐用lambda传递参数,核心是利用Compose的重组优化机制:当参数是lambda时,如果lambda没有捕获不稳定状态,Compose可以跳过该部分的重组;如果直接传值,当值变化时会触发整个组件的重组。但使用lambda时要注意参数类型匹配,避免出现本次的类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:25:05