Android Jetpack Compose中使用remember仍无法获取同一类实例的问题
问题描述
运行代码后发现,UI重组时s1.hashCode()与s2.hashCode()返回值不同。明明已经为rememberOtherState()函数添加了remember关键字,为何在Android Jetpack Compose中仍无法获取同一OtherState类实例?
代码示例
class OtherState (context: Context) { ... } @Composable fun rememberOtherState(): OtherState { val context = LocalContext.current return remember { OtherState(context) } } @Composable fun TitleWithToolBar( ) { val s1=rememberOtherState() val s2=rememberOtherState() Row( modifier = Modifier ) { log(s1.hashCode().toString()+" S1") log(s2.hashCode().toString()+" S2") ... }
原因与解决方法
- 根本原因:
remember的作用是在当前Composable节点的重组周期内缓存对象,但每次调用rememberOtherState()时,函数内部的remember都会创建一个独立的缓存单元。你在TitleWithToolBar里连续调用两次rememberOtherState(),相当于触发了两次独立的缓存逻辑,自然会生成两个不同的OtherState实例。 - 解决办法:
- 复用同一实例:只调用一次
rememberOtherState(),将实例赋值给变量后多次使用:@Composable fun TitleWithToolBar( ) { val sharedState = rememberOtherState() val s1 = sharedState val s2 = sharedState Row( modifier = Modifier ) { log(s1.hashCode().toString()+" S1") log(s2.hashCode().toString()+" S2") ... } - 跨Composable共享:如果需要在多个Composable组件间共享同一
OtherState实例,可以把状态提升到父Composable中通过参数传递;或者使用ViewModel托管状态(适合全局或跨页面共享场景);若需跨配置变更保存状态,可结合rememberSaveable实现自定义持久化策略。
- 复用同一实例:只调用一次
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

