Android Hilt如何在指定的多个Fragment之间共享依赖实例?
解决方案
你需要为这3个Fragment组成的整个创建流程定义一个独立的作用域,让Interactor的生命周期和这个流程绑定,这里提供两种主流实现方式:
方案1:基于Jetpack Navigation导航图作用域(推荐)
如果你的Fragment跳转是通过Jetpack Navigation实现的,直接用导航图作用域即可:
- 把这三个创建流程的Fragment放到同一个嵌套导航图中,给嵌套导航图设置id,例如
R.id.create_user_flow - 自定义和流程绑定的作用域注解:
@Scope @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class CreateUserFlowScope
- 给你的Interactor添加上述作用域注解:
@CreateUserFlowScope class CreateUserInteractor @Inject constructor() { // 你的业务逻辑 }
- 为流程创建一个共享ViewModel,将Interactor注入到ViewModel中,三个Fragment统一通过
by hiltNavGraphViewModels<CreateUserViewModel>(R.id.create_user_flow)获取同一个ViewModel实例,自然拿到共享的Interactor。当整个创建流程结束、嵌套导航图被弹出回退栈时,ViewModel会被销毁,Interactor也会同步被回收,不会残留上一次流程的数据。
方案2:基于父Fragment作用域
如果你没有使用Jetpack Navigation,可以用无UI的父Fragment作为流程容器:
- 给Interactor添加
@FragmentScoped注解 - 创建一个无UI的
CreateUserFlowParentFragment,把三个流程Fragment作为它的子Fragment添加管理 - 父Fragment中直接注入Interactor,子Fragment可以通过父Fragment实例获取共享的Interactor,也可以在子Fragment注入时指定依赖源为父Fragment。当流程结束父Fragment被销毁时,绑定到父Fragment作用域的Interactor也会一同被销毁。
原方案问题说明
@Singleton/@ActivityScoped的作用域和Application/Activity生命周期绑定,只要Activity不销毁实例就会一直复用,自然会残留上一次创建流程的数据- 不加作用域或者加
@FragmentScoped的话,每个Fragment会生成独立的Interactor实例,无法实现数据共享
内容的提问来源于stack exchange,提问作者Pavel Shorokhov
相关产品推荐
相关产品推荐

