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

Sep*_*hah 6 android kotlin data-class recompose android-jetpack-compose

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

考虑这个样本

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
) { 
...
}
Run Code Online (Sandbox Code Playgroud)

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

换句话说,当我们将一个数据类发送给可组合函数时,我们只更改其中的一个成员,是否会导致整个函数重新组合?或者重组方面,它与使用扁平输入时具有相同的性能吗?

预先感谢您的帮助。

jpe*_*aro 2

我认为选择其中之一对性能的影响很小。我认为 Compose 开发人员只是不认为数据类作为参数是最佳路线,我同意。

我不明白这是怎么回事:

  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
) { 
...
}
Run Code Online (Sandbox Code Playgroud)

比这个更好:

@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
) { 
...
}
Run Code Online (Sandbox Code Playgroud)

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