Jetpack Compose中@Composable内使用get()属性报错如何解决
问题原因
这是Jetpack Compose编译器的固有语法限制:目前不支持在@Composable注解的函数内部,声明带有自定义getter/setter的属性。
Kotlin原生本身支持在函数内定义带自定义访问器的属性,因此你把对应代码写在@Composable外部时可以正常运行,只有放到Composable函数内部才会触发语法报错。
可行的替代方案
根据你的使用场景,可以选择以下任意一种方式实现相同效果:
- 把带自定义访问器的属性移到
@Composable函数外部,作为顶层属性或者类的成员属性,即可正常使用get/set逻辑。 - 如果逻辑必须绑定在Composable内部,将自定义访问器替换为普通函数实现。比如你示例中的
val g:Int get()=88可以改写成:@Composable fun Test() { fun g() = 88 // 后续使用时调用g()即可 } - 如果自定义访问器的逻辑依赖Compose内部的状态变量,推荐用
derivedStateOf封装计算逻辑,还能自带性能优化:@Composable fun Test() { val baseCount by remember { mutableStateOf(0) } // 替代自定义getter,仅当baseCount变化时才会重新计算 val doubledCount by remember { derivedStateOf { baseCount * 2 } } } - 对于带自定义setter的var属性,同样可以把set逻辑封装成普通函数实现,避免在Composable内部声明带自定义访问器的属性。
内容的提问来源于stack exchange,提问作者Angel Koh
相关产品推荐
相关产品推荐

