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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:36:04