在 JetpackCompose 中,我们看到所有内置的可组合项都有扁平化输入,这是有目的的吗?或者用数据 class 包装输入具有相同的性能?

In JetpackCompose we see all built in composables have flatten inputs,is it with purpose? or wrapping the inputs with data class has same performance?

在 Jetpack Compose 中,我们看到所有内置可组合项都有扁平化输入,这是有意为之吗?或者用数据 class 包装太多输入(这是良好而干净的做法)具有相同的性能?

考虑这个样本

data class SettingsItemEntity(
    val title: String,
    val description: String? = null,
    @DrawableRes val imageResId: Int? = null,
    val isChecked: Boolean? = null,
    val showDivider: Boolean = true,
    val onItemClicked: () -> Unit = {},
    val onCheckedChange: (isChecked: Boolean) -> Unit = {},
    val buttonLabel: String? = null,
    val onButtonClicked: () -> Unit = {},
)

@Composable
fun SettingsItem(
    entity: SettingsItemEntity,
    modifier: Modifier = Modifier
) { 
...
}

将输入作为数据 class 或在性能(重组)中扁平化输入发送会更好吗?或者有相同的结果?

换句话说,当我们向可组合函数发送一个数据class,而我们只改变它的一个成员时,是否会导致整个函数重构? 或者重组明智,它具有与使用扁平化输入时相同的性能?

预先感谢您的帮助。

我认为选择一个或另一个对性能的影响很小。我认为 Compose 开发人员只是不认为数据 classes 作为最佳路由的参数,我同意。

我不明白这是怎么回事:

  data class SettingsItemEntity(
    val title: String,
    val description: String? = null,
    @DrawableRes val imageResId: Int? = null,
    val isChecked: Boolean? = null,
    val showDivider: Boolean = true,
    val onItemClicked: () -> Unit = {},
    val onCheckedChange: (isChecked: Boolean) -> Unit = {},
    val buttonLabel: String? = null,
    val onButtonClicked: () -> Unit = {},
)

@Composable
fun SettingsItem(
    entity: SettingsItemEntity,
    modifier: Modifier = Modifier
) { 
...
}

比这个更好:

@Composable
fun SettingsItem(
    title: String,
    description: String? = null,
    @DrawableRes imageResId: Int? = null,
    isChecked: Boolean? = null,
    showDivider: Boolean = true,
    onItemClicked: () -> Unit = {},
    onCheckedChange: (isChecked: Boolean) -> Unit = {},
    buttonLabel: String? = null,
    onButtonClicked: () -> Unit = {},
    modifier: Modifier = Modifier
) { 
...
}

让数据 class 参与与具有大量参数的 compose 函数的每次交互只会给您的代码增加不必要的复杂性。它为阅读文档、调用函数和对代码库的整体理解增加了更多障碍,其唯一好处是函数声明括号内的代码更少(但其他地方的代码更多)。