在 @Composable (Jetpack Compose) 中使用 get() 时出错

Ang*_*Koh 6 kotlin android-jetpack-compose

是否可以在 @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
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Phi*_*hov 10

在可组合项内禁止使用支持属性,因为它会阻止 Compose 在get()结果更改时进行更新,以及阻止缓存重复操作的结果。

你应该使用remember变量。了解有关compose 中的状态的更多信息。

假设您的变量是根据其他一些变量计算的。然后,使用remember,您可以缓存该操作的结果。您需要将您所依赖的所有变量g作为键传递给remember,以便仅计算一次,直到其中一个键发生更改:

@Composable
fun TestView(a: Int = 44, b: Int = 2) {
    val g = remember(a, b) { a * b }
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用视图模型,但在这种情况下,您将负责使用新值重新组合视图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
Run Code Online (Sandbox Code Playgroud)