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

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实例。
  • 解决办法:
    1. 复用同一实例:只调用一次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")
          ...
      }
      
    2. 跨Composable共享:如果需要在多个Composable组件间共享同一OtherState实例,可以把状态提升到父Composable中通过参数传递;或者使用ViewModel托管状态(适合全局或跨页面共享场景);若需跨配置变更保存状态,可结合rememberSaveable实现自定义持久化策略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:22:12