使用 Dagger Hilt 创建子组件

Creating subcomponents with Dagger Hilt

基于this tutorial添加子组件使用 Dagger Hilt 需要

@Singleton
class UserManager @Inject constructor(
    // Since UserManager will be in charge of managing the UserComponent's
    // lifecycle, it needs to know how to create instances of it. We use the
    // provider (i.e. factory) Dagger generates for us to create instances of UserComponent.
    private val userComponentProvider: Provider<UserComponent.Builder>
) {

  /**
   *  UserComponent is specific to a logged in user. Holds an instance of
   *  UserComponent. This determines if the user is logged in or not, when the
   *  user logs in, a new Component will be created.
   *  When the user logs out, this will be null.
   */
  var userComponent: UserComponent? = null
      private set

  ...

  private fun userLoggedIn(userId: String) {
    // When the user logs in, we create a new instance of UserComponent
    val user = createUser(userId)
    userComponent = userComponentProvider.get().setUser(user).build()
  }

  private fun logout() {
    // When the user logs out, we remove the instance of UserComponent from memory
    userComponent = null
  }
}

这就是您创建子组件的方式userComponent = userComponentProvider.get().setUser(user).build()

我的问题是如何实现Provider

private val userComponentProvider: Provider<UserComponent.Builder>

因为它没有显示它是如何提供给 UserManager class

我正在尝试创建一个 AppComponent 来测试子组件如何与 Dagger Hilt 一起工作

@DefineComponent(parent = ApplicationComponent::class)
interface AppComponent {

    @DefineComponent.Builder
    interface Builder {
        fun application(@BindsInstance application: Application): Builder
        fun build(): AppComponent
    }

}

并在申请中

@HiltAndroidApp
class MyApplication : Application() {

    private val appComponentProvider by lazy {
        object : Provider<AppComponent.Builder> {
            override fun get(): AppComponent.Builder {
                ??????
            }

        }
    }

    val appComponent by lazy {
        appComponentProvider.get().application(this).build()
    }
    
}

我应该如何在 get() 中创建构建器,是不是创建了实现 Provider 的匿名 class 正确?

My question is how to implement Provider

您不必自己实现 Provider -- Dagger 知道如何自动创建任何绑定的提供程序。因此,在您的情况下,您应该将提供者注入您的应用程序:

@HiltAndroidApp
class MyApplication: Application() {
  @Inject lateinit var provider: Provider<MySubcomponent.Builder>

  val mySubcomponent by lazy {
      provider.get()....build()
  }  
}