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

如何通过Hilt将对象实例限定在Jetpack Compose导航图生命周期?

多模块Jetpack Compose项目中限定功能模块生命周期的依赖注入问题

我有一个多模块Jetpack Compose项目,希望将部分对象实例的生命周期限定在对应功能模块内。比如AuthRepo实例,要绑定AuthFeature的生命周期,用户完成登录、导航到其他功能模块(Auth导航图从回退栈移除)后,立即从内存中销毁它,且AuthFeature包含多个可组合屏幕。

我的MainActivity核心代码如下:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
        ...
        NavHost(navController = navController, startDestination = *AuthFeature graph*) {
           navigation(*AuthFeature graph*) {
               composable(*First Screen*) { backStackEntry ->
                   val authGraphEntry = *get authGraphEntry*
                   val vm = hiltViewModel<AuthViewModel>(authGraphEntry)
                   ...
               }

               composable(*Second Screen*) { backStackEntry ->
                   val authGraphEntry = *get authGraphEntry*
                   val vm = hiltViewModel<AuthViewModel>(authGraphEntry)
                   ...
               }
          }

          *Other feature graph with multiple screens*
           
     }
}    

当前状态与问题

  • 当AuthFeature的多个屏幕共用同一个AuthViewModel时,一切正常:AuthViewModel的生命周期绑定到Auth导航图,注入AuthRepo时用Hilt的@ViewModelScoped注解,当导航到其他功能模块(Auth导航图被弹出栈)后,ViewModel和AuthRepo都会被销毁。
  • 但如果为每个屏幕单独创建ViewModel,问题就出现了:两个屏幕需要共用同一个AuthRepo实例,用@ViewModelScoped会生成两个独立实例,用@Singleton则实例会全局留存无法销毁。

已排除的方案

  • 为每个功能模块单独包裹Activity,搭配@ActivityRetainedScoped:但项目采用单Activity模式,此方案不适用。
  • 用Dagger自定义作用域:不想手动管理组件的生命周期,复杂度太高。
  • 坚持单功能单ViewModel模式:会导致ViewModel代码过度膨胀,不符合代码拆分的需求。

求可行的解决方案,若我的表述有错误也请指出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 11:07:21