kotlin 撰写伴奏分页器中的TabRow/Tab重新组合问题

nnvyjq4y  于 2022-11-25  发布在  Kotlin
关注(0)|答案(1)|浏览(184)

我试图在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.如何解决此重组问题
非常感谢。

dtcbnfnu

dtcbnfnu1#

......每当我们点击标签项时,内部内容就会被奇怪地重新组合。我不明白为什么会发生这种情况......
很难确定这种“奇怪”是什么,你在这里提到的可组合性内部可能有一些东西。
你也没有指定API是什么,所以我复制并粘贴了你的代码和集成的伴奏视图分页器,然后我能够运行它,虽然不是在一个Android Studiore-compositioncount功能。
由于您只关心API的TextIcon参数,我认为这是您无法控制的。我怀疑您获得这些重新组合计数的原因是因为您进行了animatingpage切换。

coroutineScope.launch {
       pagerState.animateScrollToPage(index)
}

虽然我不能在另一个具有re-composition功能的Android Studio版本上尝试这个操作,但我认为(尽管我不确定)滚动到另一个没有animationpage**会产生较少的重新合成计数。

coroutineScope.launch {
      pagerState.scrollToPage(index)
}

如果它仍然困扰着你,最好的行动方针是直接问them,虽然我个人不会太关心这个,因为他们是一个公认的API的一部分,它只是TextIcon被重新组成多次的动画,这也是罚款IMO。
现在,如果你对你的PagerSampleItem稳定性有一些担心(你可以完全控制),根据提供的代码和屏幕截图,我认为你很好。
实际上,article建议了一个功能,用于检查composable的稳定性,我运行了它,得到了此报告。

restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun PagerSampleItem(
  stable page: Int
)

关于这份报告的一切都在我链接的文章中。
此外,您的TextIcon分别使用稳定且不可变的StringImageVector(标记为@Immutable)。
所以TLDR,IMO你的代码是好的,你的PagerSampleItem不是截图中的re-composing

相关问题