我试图在Jetpack组合中创建一个示例标签视图,因此结构将类似于在父标签行中,我们正在迭代标签标题并创建可组合的标签。
更精确的代码将是这样的。
@OptIn(ExperimentalPagerApi::class)
@Composable
private fun MainApp() {
Scaffold(
topBar = {
TopAppBar(
title = { Text(stringResource(R.string.app_name)) },
backgroundColor = MaterialTheme.colors.surface
)
},
modifier = Modifier.fillMaxSize()
) { padding ->
Column(Modifier.fillMaxSize().padding(padding)) {
val pagerState = rememberPagerState()
val coroutineScope = rememberCoroutineScope()
val tabContents = listOf(
"Home" to Icons.Filled.Home,
"Search" to Icons.Filled.Search,
"Settings" to Icons.Filled.Settings
)
HorizontalPager(
count = tabContents.size,
state = pagerState,
contentPadding = PaddingValues(horizontal = 32.dp),
modifier = Modifier
.weight(1f)
.fillMaxWidth()
) { page ->
PagerSampleItem(
page = page
)
}
TabRow(
selectedTabIndex = pagerState.currentPage,
backgroundColor = MaterialTheme.colors.surface,
contentColor = MaterialTheme.colors.onSurface,
indicator = { tabPositions ->
TabRowDefaults.Indicator(
Modifier
.pagerTabIndicatorOffset(pagerState, tabPositions)
.height(4.dp)
.background(
color = Color.Green,
shape = RectangleShape
)
)
}
) {
tabContents.forEachIndexed { index, pair: Pair<String, ImageVector> ->
Tab(
selected = pagerState.currentPage == index,
selectedContentColor = Color.Green,
unselectedContentColor = Color.Gray,
onClick = {
coroutineScope.launch {
pagerState.animateScrollToPage(index)
}
},
text = { Text(text = pair.first) },
icon = { Icon(imageVector = pair.second, contentDescription = null) }
)
}
}
}
}
}
@Composable
internal fun PagerSampleItem(
page: Int
) {
// Displays the page index
Text(
text = page.toString(),
modifier = Modifier
.padding(16.dp)
.background(MaterialTheme.colors.surface, RoundedCornerShape(4.dp))
.sizeIn(minWidth = 40.dp, minHeight = 40.dp)
.padding(8.dp)
.wrapContentSize(Alignment.Center)
)
}
接下来我的问题是,每当我们点击标签项时,内部内容就会被奇怪地重新组合。我不明白为什么会发生这种情况。
- 我附上了一个图像的重组计数下面,请看看,太,这将是很好的,如果你们能帮助我更多的了解这一点,也为未来的开发人员.*
现阶段有两个问题需要解决
1.当视图变得更加复杂时,是否会产生任何性能问题
1.如何解决此重组问题
非常感谢。
1条答案
按热度按时间dtcbnfnu1#
......每当我们点击标签项时,内部内容就会被奇怪地重新组合。我不明白为什么会发生这种情况......
很难确定这种“奇怪”是什么,你在这里提到的可组合性内部可能有一些东西。
你也没有指定API是什么,所以我复制并粘贴了你的代码和集成的伴奏视图分页器,然后我能够运行它,虽然不是在一个
Android Studio
与re-composition
count
功能。由于您只关心API的
Text
和Icon
参数,我认为这是您无法控制的。我怀疑您获得这些重新组合计数的原因是因为您进行了animating
和page
切换。虽然我不能在另一个具有
re-composition
功能的Android Studio
版本上尝试这个操作,但我认为(尽管我不确定)滚动到另一个没有animation
的page
**会产生较少的重新合成计数。如果它仍然困扰着你,最好的行动方针是直接问them,虽然我个人不会太关心这个,因为他们是一个公认的API的一部分,它只是
Text
和Icon
被重新组成多次的动画,这也是罚款IMO。现在,如果你对你的
PagerSampleItem
稳定性有一些担心(你可以完全控制),根据提供的代码和屏幕截图,我认为你很好。实际上,article建议了一个功能,用于检查
composable
的稳定性,我运行了它,得到了此报告。关于这份报告的一切都在我链接的文章中。
此外,您的
Text
和Icon
分别使用稳定且不可变的String
和ImageVector
(标记为@Immutable)。所以TLDR,IMO你的代码是好的,你的
PagerSampleItem
不是截图中的re-composing
。