如何在data class中使用Jetpack Compose State的by委托语法?
Kotlin目前不支持你伪代码中写的在构造参数赋值时直接加by的语法,但可以通过如下方案实现你要的省略.value的调用效果:
你可以在data class内部声明私有State类型的幕后属性,再把公开的普通类型属性通过by委托给这个幕后属性,示例代码如下:
data class MyUiProps( // 私有State类型幕后属性,不对外暴露 private val _message: State<String> ) { // 公开的普通类型属性,委托给幕后State var message: String by _message }
创建实例和调用的用法完全符合你的预期:
// 从ViewModel获取状态创建实例 val props = MyUiProps(viewModel.message.observeAsState("")) // 本地创建状态生成实例 val props = MyUiProps(remember { mutableStateOf("") }) // 直接读写属性,不需要额外加.value props.message = "Yay no boilerplate" val currentMsg = props.message
如果你的属性是只读状态,把var message改成val message即可,逻辑完全兼容。该方案不会破坏原有单向数据流的设计规则,只是通过Kotlin委托的能力消除了.value的样板代码。
内容的提问来源于stack exchange,提问作者kierans
相关产品推荐
相关产品推荐

