我有这个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
时,Test
的title:Int
不会更改,但会使用相同参数再次创建tabModifier
(但是新示例)。这在某种程度上强制了所有5个选项卡的重组,当选择新选项卡时。但是如果我将tabModifier
移到Test
中,并给予tab==selectedTab
,tab
,selectedTab
作为参数,它按预期工作。
使用相同参数再次创建Modifier
是否不稳定?我们是否可以避免重新组合而不将tabModifier
移动到Test
?(修改器接口标记为@Stable)*
1条答案
按热度按时间gajydyqb1#
我不知道它的确切影响,但是把修饰符 Package 在一个记忆中为我解决了重新组合的问题。