我试图在Jetpack Compose中创建一个示例选项卡视图,因此其 struct 将类似于 在父TabRow中,我们迭代选项卡标题并创建可组合的选项卡.

更精确的代码将如下所示.

@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)
    )
}

我的问题是,每当我们点击选项卡项时,内部内容都会奇怪地重新组合.我不能理解为什么会发生这种事.

Am attaching an image of the recomposition counts below, please take a look that too, it would be good if you guys can help me more for understand this, also for future developers.

在这个阶段有两个问题需要解决

  1. Whether it will create any performance issue, when the view getting more complex
  2. How to resolve this recompostion issue

非常感谢.

enter image description here

推荐答案

…每当我们单击选项卡项时, 内部内容被重新编排得如此奇怪.我不能理解为什么 这件事发生了.

很难确定这种"怪异"是什么,你在这里提到的沉着的内心可能有一些东西.

你也没有指定API是什么,所以我复制并粘贴了你的代码和集成的伴奏视图pager ,然后我能够在具有re-composition-count功能的Android Studio上运行not.

由于您只关心API的TextIcon参数,所以我认为应该是out of your control.我怀疑你之所以得到那些重新组合的次数,是因为你是animatingpage的切换.

coroutineScope.launch {
       pagerState.animateScrollToPage(index)
}

虽然我不能在另一个具有re-composition功能的Android Studio版本上try 这一点,但我认为(尽管我不确定)滚动到另一个page without animation会产生较少的重新组合次数.

coroutineScope.launch {
      pagerState.scrollToPage(index)
}

如果它仍然困扰着你,最好的办法是直接问them,尽管就我个人而言,我不会太在意这一点,因为它们是公认的API的一部分,而且它只是TextIcon被一部动画多次重新组合,这也是很好的IMO.

根据提供的代码和屏幕截图,如果你对你的PagerSampleItem solidity 有一些担忧(你有完全的控制权),我认为你很好.

实际上,这个article提供了一个功能来判断composable的 solidity ,我运行了它,得到了这份报告.

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

关于这份报告的一切都在我链接的文章中.

此外,您的TextIcon使用的是StringImageVector,它们分别是稳定和不可变的(标记为@Immutable).

所以TLDR,我相信你的代码很好,截图中你的PagerSampleItem不是re-composing.

Android相关问答推荐

Android配置设置. gradle不同应用风格

Android 14(Oneui 6)中的本地推送通知行为不一致

有人能帮我在应用程序上使用模拟位置时避免被发现吗?我已经反编译并粘贴了一个代码,S小文件

Android在NavHost中的LazyColumn中编写约束布局:error - replace()在未放置的项目上调用

Android 11:在try 获取文件的永久权限后,仍然没有读写权限

使用lazyColumn迁移paging3的旧代码

Jetpack Compose 使用 SavedStateHandle 发送返回结果不适用于 ViewModel 中注入的 SavedStateHandle

如何在Android Studio中删除项目

如何在 Android Studio 中为带有 Room 的 SQLite 编写需要参数的查询?

为什么我收到这个错误我需要安装 android studio

@Immutable 对数据类有什么好处?

React Native Android 应用程序在调试模式下运行良好,但当我们发布 apk 时,它会生成旧版本的应用程序

观察软键盘可见性,打开/关闭 Jetpack Compose

在 Google Play 中将用户从开放测试转移到生产的过程是怎样的?

处理程序 postDelayed 方法不起作用,kotlin 应用程序卡在启动画面上

没有互联网连接时,Firebase Storage putFile() 永远不会完成

Jetpack compose 绘制形状

将生成的 AAR 与 Composables 一起使用时未解决的参考

多个项目 react-native android 构建错误

在使用 Retrofit 和 Room 时,我是否需要提及协程调度程序?