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

使用Jetpack Compose的TabRow时,tabPositions参数是在哪里实例化的?

TabRow中tabPositions参数的实例化流程

indicator是TabRow暴露的函数类型参数,类型为@Composable (tabPositions: List<TabPosition>) -> Unit,你传入的仅为该函数的实现逻辑,函数的调用权归属TabRow内部,因此tabPositions参数由TabRow内部计算完成后主动传入,实例化环节完全在TabRow的布局流程中:

  • TabRow在渲染阶段会先测量你通过tabs参数传入的所有Tab组件,统计每个Tab的宽度、相对于TabRow容器的左偏移量等布局信息
  • 测量完成后,TabRow会将每个Tab的布局信息封装为TabPosition实例,所有Tab的TabPosition会被组装为List<TabPosition>集合,也就是你拿到的tabPositions参数
  • 当TabRow需要渲染指示器时,会主动调用你传入的indicator函数,将刚才生成的List<TabPosition>作为入参传入,此时你在indicator的实现逻辑中就能直接拿到实例化完成的tabPositions

官方给出的默认indicator实现,就是基于TabRow传入的tabPositions,取出选中索引对应的Tab位置,通过tabIndicatorOffset修饰符将指示器定位到对应Tab的下方。你也可以基于传入的tabPositions自定义指示器的位置、尺寸等样式,示例如下:

var selectedTab by remember { mutableIntStateOf(0) }
TabRow(
    selectedTabIndex = selectedTab,
    // 自定义indicator实现
    indicator = { tabPositions ->
        TabRowDefaults.Indicator(
            modifier = Modifier
                .tabIndicatorOffset(tabPositions[selectedTab])
                .width(24.dp), // 自定义指示器宽度为固定24dp
            color = Color.Red
        )
    }
) {
    Tab(onClick = { selectedTab = 0 }, text = { Text("首页") })
    Tab(onClick = { selectedTab = 1 }, text = { Text("推荐") })
    Tab(onClick = { selectedTab = 2 }, text = { Text("我的") })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:54:01