【问题标题】:Creating subcomponents with Dagger Hilt使用 Dagger Hilt 创建子组件
【发布时间】:2020-07-27 13:13:49
【问题描述】:

基于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 类的

我正在尝试创建一个 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 的匿名类不正确吗?

【问题讨论】:

    标签: android dagger-2 dagger-hilt


    【解决方案1】:

    我的问题是如何实现Provider

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

    @HiltAndroidApp
    class MyApplication: Application() {
      @Inject lateinit var provider: Provider<MySubcomponent.Builder>
    
      val mySubcomponent by lazy {
          provider.get()....build()
      }  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-18
      • 2020-12-19
      • 2022-01-17
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多