android 具有相同参数的Jetpack合成修改器强制重新合成

a64a0gku  于 2023-01-24  发布在  Android
关注(0)|答案(1)|浏览(126)

我有这个ScrollableTabRow与标签列表内:

@Immutable
enum class Tab(val title:Int){
    Some(R.string.some),
    Other(R.string.other);
}

@Composable
fun MyTab(modifier: Modifier = Modifier,
          tabs: List<Tab>,
          selectedTab: Tab,
          onTabSelected: (Tab) -> Unit) {
    Log.d("MyTab", "Draw")

    if (tabs.isEmpty()) {
        return
    }

    ScrollableTabRow(selectedTabIndex = tabs.indexOf(selectedTab),
                     modifier
                         .navigationBarsPadding()
                         .requiredHeight(48.dp),
                     backgroundColor = Color.Transparent,
                     indicator = {},
                     divider = {}) {

        tabs.forEach { tab ->
            Log.d("MyTab", "${tab.title}-${tab == selectedTab}")
            val tabModifier = Modifier
                .clip(RoundedCornerShape(8.dp))
                .padding(horizontal = 8.dp)
                .shadow(0.5.dp, RoundedCornerShape(8.dp))
                .background(MaterialTheme.colors.surface)
                .border(1.dp,
                    if (tab==selectedTab) MaterialTheme.appColors.bottomTabSelect else Color.Transparent,
                    RoundedCornerShape(8.dp))
                .clickable {
                    if (tab==selectedTab) {
                        // already selected
                        return@clickable
                    }
                    onTabSelected(tab)
                }
                .padding(8.dp)

            Test(tab.title, tabModifier, logger)
            
        }
    }

}

@Composable
private fun Test(title: Int,
                 modifier: Modifier) {
    Log.d("MyTab", "Test")

    Text(text = stringResource(id = title),
         modifier = modifier,
         color = MaterialTheme.colors.onSurface,
         fontSize = 12.sp,
         textAlign = TextAlign.Center)
}

简单地说,它水平地排列标签列表。每当标签被选中时,它的修饰符就会更新,并且用主颜色绘制边框。如果没有选中,那么边框是透明的。
我的目标是避免标签的重新组合(* 测试代码中的可组合性 ),如果他们的状态没有改变。所以,如果我有5个标签,我选择了一个新的标签,只有2个标签的状态改变,其他3个标签不应该得到重新组合。
可组合测试以Int, Modifier作为参数。在重新组合MyTab时,Testtitle:Int不会更改,但会使用相同参数再次创建tabModifier(但是新示例)。这在某种程度上强制了所有5个选项卡的重组,当选择新选项卡时。但是如果我将tabModifier移到Test中,并给予tab==selectedTabtabselectedTab作为参数,它按预期工作。
使用相同参数再次创建Modifier是否不稳定?我们是否可以避免重新组合而不将tabModifier移动到Test
(修改器接口标记为@Stable)*

gajydyqb

gajydyqb1#

我不知道它的确切影响,但是把修饰符 Package 在一个记忆中为我解决了重新组合的问题。

Text(
    "Sample text",
    modifier = remember { <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        Modifier.clickable(onClick = { viewModel.stopFlow() })
    },
    color = Color.Red,
    style = MaterialTheme.typography.h4
)

相关问题