You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在remember块调用@Composable函数,需留存计算结果至屏幕旋转

解决方案

你可以通过以下两步调整代码,实现仅在屏幕旋转时重新计算高度:

  1. 修改ViewModel中的计算函数,移除@Composable注解
    将依赖的UI层参数(屏幕宽度)作为函数入参传入,让函数变成纯逻辑计算:

    fun calculateTopCoverHeightInDp(screenWidthInDp: Dp): Dp {
        val originalImageDimens = Size(1440f, 828f)
        val imageRatio = originalImageDimens.width / originalImageDimens.height
        return screenWidthInDp / imageRatio
    }
    
  2. 在Composable中通过带key的remember缓存计算结果
    在Composable上下文里获取LocalConfiguration,并将其作为remember的依赖key。当屏幕旋转时,configuration会更新,触发重新计算:

    val configuration = LocalConfiguration.current
    val coverImageHeightInDp = remember(configuration) {
        viewModel.calculateTopCoverHeightInDp(configuration.screenWidthDp.dp)
    }
    
    Box(modifier = Modifier
        .then(modifier)
        .fillMaxWidth()
        .height(coverImageHeightInDp)
    )
    

为什么原来的写法不行?

  • remember的初始化代码块不属于Composable上下文,因此无法在其中调用带@Composable注解的函数。
  • ViewModel中持有@Composable函数违反了架构分层原则:ViewModel应专注于业务逻辑,不应依赖UI层的Composable API(比如LocalConfiguration)。

内容的提问来源于stack exchange,提问作者Bugs Happen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:50:39