【问题标题】:Error when using get() within @Composable (Jetpack Compose)在 @Composable (Jetpack Compose) 中使用 get() 时出错
【发布时间】:2021-09-02 03:27:40
【问题描述】:
是否可以在 @Composable 函数中使用 get() 属性?我得到一个“意外的令牌”。
我们如何在 compose 中使用 set 和 get 属性?
val g:Int get()=88 // < works as expected outside @Composable
@Composable
fun Test() {
val g:Int get()=88 // < "unexpected token" error inside @Composable
}
【问题讨论】:
标签:
kotlin
android-jetpack-compose
【解决方案1】:
在 composeables 中禁止使用支持属性,因为它会在 get() 结果更改时阻止 Compose 更新以及缓存结果以进行重复操作。
您应该使用remember 变量。详细了解states in compose。
假设您的变量是根据其他一些变量计算的。然后,使用remember,您可以缓存该操作的结果。您需要将您的 g 所依赖的所有变量作为键传递给 remember,以便在其中一个键更改之前只计算一次:
@Composable
fun TestView(a: Int = 44, b: Int = 2) {
val g = remember(a, b) { a * b }
}
您也可以使用view model,但在这种情况下,您将负责使用新的g 值重新组合视图,例如对将更改的值使用可变状态。在这种情况下,计算也不会被缓存。
class ScreenViewModel : ViewModel() {
val a by mutableStateOf(44)
val b by mutableStateOf(2)
val g: Int
get() = a * b
}
@Composable
fun TestView() {
val viewModel = viewModel<ScreenViewModel>()
viewModel.g