无法从记住块调用@Composable函数

Bug*_*pen 0 android composition android-jetpack android-jetpack-compose

我想在函数中计算 Box 的高度,并且希望 compose 记住其结果而不是再次调用该函数。该函数具有一些可组合的内容,因此它是一个@Composable函数。

问题是,Compose 不允许我从remember块调用这个函数。

这是我的代码:

val coverImageHeightInDp = remember {
    viewModel.calculateTopCoverHeightInDp()
}

Box(modifier = Modifier
    .then(modifier)
    .fillMaxWidth()
    .height(coverImageHeightInDp)
)
Run Code Online (Sandbox Code Playgroud)

以及以下函数viewModel

@Composable
fun calculateTopCoverHeightInDp(): Dp {
    val originalImageDimens = Size(1440f, 828f)
    val imageRatio = originalImageDimens.width / originalImageDimens.height
    val configuration = LocalConfiguration.current
    val screenWidthInDp = configuration.screenWidthDp.dp
    return screenWidthInDp / imageRatio
}
Run Code Online (Sandbox Code Playgroud)

我该如何编码才能记住该函数的结果并且在屏幕旋转之前不会再次调用该函数?

谢谢。

Thr*_*ian 6

当您的计算函数需要 @Composable 范围中的某些变量时,您可以只传递在组合中获得的变量,例如密度或配置

fun calculateTopCoverHeightInDp(configuration: Configuration): Dp {
    val originalImageDimens = Size(1440f, 828f)
    val imageRatio = originalImageDimens.width / originalImageDimens.height
    val screenWidthInDp = configuration.screenWidthDp.dp
    return screenWidthInDp / imageRatio
}
Run Code Online (Sandbox Code Playgroud)

并将其用作

val configuration: Configuration = LocalConfiguration.current

val calculatedHeight = remember(configuration){
    calculateTopCoverHeightInDp(configuration)
}
Run Code Online (Sandbox Code Playgroud)

您还可以查看此答案,了解可组合函数和不可组合函数之间的区别。

Android 中的可组合函数和普通函数有什么区别?