Data class constructor参数默认可组合值

Data class contsructor parameter default Composable value

是否可以让数据 class 具有默认值设置为某些 @Composable val 的构造函数参数?像这样:

data class MyStyle(
    val marginTop: Dp = 8.dp,
    val marginBottom: Dp = 16.dp,
    val myTextStyle: TextStyle = MaterialTheme.typography.body1
)

错误:

@Composable invocations can only happen from the context of a @Composable function

不,这是不允许的。如果尝试将 @Composable 添加到任何构造函数,您将得到:

This annotation is not applicable to target 'constructor'

这是因为在视图生命周期中重组可能发生多次,甚至在动画期间发生一帧,在这种情况下为每次重组创建新对象会降低应用程序的性能。在 Thinking in Compose.

中查看有关重组的更多信息

相反,您应该使用 remember 来存储重组之间的值。您可以将所有可能会更改的变量作为键传递给 remember,因此仅在需要时才重新计算该值:

@Composable
fun rememberMyStyle(
    marginTop: Dp = 8.dp,
    marginBottom: Dp = 16.dp,
    myTextStyle: TextStyle = MaterialTheme.typography.body1,
) = remember(marginTop, marginBottom, myTextStyle) {
    MyStyle(marginTop, marginBottom, myTextStyle)
}