如何通过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
相关产品推荐
相关产品推荐

