使用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
相关产品推荐
相关产品推荐

