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)
}
是否可以让数据 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)
}