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

Jetpack Compose中点击Tab调用lambda传Int值报错如何修复?

Jetpack Compose Tab点击回调报错修复方案

问题根源

你给onTabSelected参数错误添加了@Composable注解,该回调是在Tab的onClick点击事件中触发,onClick属于普通函数作用域,不属于Composable重组上下文,无法调用带@Composable注解的函数,这是报错的核心原因。

修复步骤

  1. 移除onTabSelected参数的@Composable注解,将其改为普通函数类型:
@ExperimentalPagerApi
@Composable
fun Tabs(
    pagerState: PagerState,
    modifier: Modifier,
    state: MyJobsState,
    // 此处移除@Composable注解即可
    onTabSelected: (tabPage: Int) -> Unit
) {
    val scope = rememberCoroutineScope()
    ScrollableTabRow(
        selectedTabIndex = pagerState.currentPage,
        indicator = { tabPositions ->
            TabRowDefaults.Indicator(
                modifier.pagerTabIndicatorOffset(pagerState, tabPositions),
                height = 0.dp,
            )
        },
        edgePadding = 0.dp,
        divider = {}
    ) {
        state.items?.forEachIndexed { index, _ ->
            Tab(
                text = {
                    Text(
                        text = state.items[index].title ?: "")
                },
                selected = pagerState.currentPage == index,
                onClick = {
                    scope.launch {
                        pagerState.animateScrollToPage(index)
                    }
                    onTabSelected.invoke(index)
                }
            )
        }
    }
}
  1. 如果需要在回调触发后更新UI,直接在父组件调用Tabs时,把回调拿到的下标赋值给remember包裹的可变状态即可,Compose会自动监听状态变化触发重组,无需给回调添加@Composable注解。
  2. 可选优化:如果需要保证回调在Tab页切换完成后再触发,可以把回调调用逻辑放到协程的animateScrollToPage之后:
onClick = {
    scope.launch {
        pagerState.animateScrollToPage(index)
        // 滚动完成后再触发回调,保证状态同步
        onTabSelected.invoke(index)
    }
}

补充说明

你之前尝试使用LaunchedEffect和协程没有解决问题,是因为报错的核心是函数上下文不匹配,和副作用、协程逻辑无关,修改参数类型即可解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:36:01