无法在remember块调用@Composable函数,需留存计算结果至屏幕旋转
解决方案
你可以通过以下两步调整代码,实现仅在屏幕旋转时重新计算高度:
修改ViewModel中的计算函数,移除@Composable注解
将依赖的UI层参数(屏幕宽度)作为函数入参传入,让函数变成纯逻辑计算:fun calculateTopCoverHeightInDp(screenWidthInDp: Dp): Dp { val originalImageDimens = Size(1440f, 828f) val imageRatio = originalImageDimens.width / originalImageDimens.height return screenWidthInDp / imageRatio }在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
相关产品推荐
相关产品推荐

