Kotlin能否设置@Composable值作为data类构造参数的默认值?
能否将@Composable属性作为data类构造参数的默认值
不能直接这么实现,你遇到的报错属于编译期的Compose上下文校验错误。
报错原因
MaterialTheme.typography是被@Composable注解标记的属性,它的getter方法本质是@Composable调用- Compose要求所有@Composable调用必须发生在另一个被@Composable标记的函数、lambda的上下文当中
- data类的构造参数默认值是在类实例化的普通上下文计算,不属于合法的Composable调用环境,因此会触发报错。
可行实现方案
方案1:在Composable作用域内传入默认值
移除data类构造中依赖Composable属性的默认值,在使用该data类的Composable函数中赋值:
data class MyStyle( val marginTop: Dp = 8.dp, val marginBottom: Dp = 16.dp, // 移除依赖Composable的默认值 val myTextStyle: TextStyle ) // 在Composable参数中指定默认值 @Composable fun CustomComponent( style: MyStyle = MyStyle(myTextStyle = MaterialTheme.typography.body1) ) { // 组件业务逻辑 }
方案2:封装@Composable工厂方法生成默认实例
如果需要多处复用默认配置,可以封装一个Composable作用域下的工厂函数:
data class MyStyle( val marginTop: Dp = 8.dp, val marginBottom: Dp = 16.dp, val myTextStyle: TextStyle ) // 生成默认配置的Composable工厂方法 @Composable fun rememberMyStyle( marginTop: Dp = 8.dp, marginBottom: Dp = 16.dp, myTextStyle: TextStyle = MaterialTheme.typography.body1 ): MyStyle { return remember(marginTop, marginBottom, myTextStyle) { MyStyle(marginTop, marginBottom, myTextStyle) } } // 使用示例 @Composable fun CustomComponent() { val defaultStyle = rememberMyStyle() // 组件业务逻辑 }
内容的提问来源于stack exchange,提问作者iknow
相关产品推荐
相关产品推荐

