当前位置: 首页 > 知识库问答 >
问题:

用匕首柄创建子组件

夏何平
2023-03-14

基于本教程使用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()

我的问题是如何实现提供程序

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的匿名类不正确吗?

共有1个答案

那存
2023-03-14

我的问题是如何实现Provider

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

kotlin prettyprint-override">@HiltAndroidApp
class MyApplication: Application() {
  @Inject lateinit var provider: Provider<MySubcomponent.Builder>

  val mySubcomponent by lazy {
      provider.get()....build()
  }  
}
 类似资料:
  • 我正在尝试为我的navControl ler提供匕首柄。但是我使用的方法不起作用。我想提供navControl ler以便通过构造函数注入将其注入我的片段中。 我还创建了FragmentWorks类,以便通过构造函数注入我的依赖项。我知道是这里的问题,但我不知道正确的解决方案… 感谢您的帮助,谢谢! 原因:java.lang.ClassCastException:com.example.app。应

  • 我正在尝试通过修改MVP应用程序Belajar应用程序在MVVM架构中应用DaggerApplicationComponent,但是我刚刚收到未解决的引用:DaggerApplicationComponent的错误。Kotlin kapt 已被应用,我尝试重建项目,但我从应用程序组件收到错误:C:\Users\3\AndroidStudioProjects\belajar3 - Copy (3)\

  • 我在应用程序中有多个匕首瞄准镜 UserScope-范围表示用户会话 ActivityScope-每个活动的范围 UserComponent-CoreComponent的子组件 UserManager-创建UserComponent的单例程序 HomeComponent-依赖于UserComponent的组件 我试图在下更新用户对象,但不知何故,对象更新没有反映在它的依赖组件上。因此,一旦更新屏幕

  • 我是Android开发新手,需要为大学建立我的第一个项目。大学用的是旧版本的XML和Java,但是我想学Compose,所以我学了Kotlin。 现在,在设置好一切之后,我试图使用hiltViewModel()方法将视图模型注入到可组合函数中,但我得到了一个错误。我看了这个教程:https://www.youtube.com/watch?v=A7CGcFjQQtQ 在让这个工作之后。现在它说找不到

  • 我使用Dagger-Hilt进行依赖注入,但是我不知道如何在抽象类中进行字段注入。 [DI包] 我使用匕首剑柄(AppModule.kt)将“ErrorHandler”作为单例提供 扩展到BaseUseCase以上的用例都是为匕首剑柄(UseCaseModule.kt)编写的。 > 我尝试使用匕首柄(如BaseUseCaseModule.kt)提供或绑定BaseUseCase类,但是由于它具有类型

  • 这很好,但是如果我使用全局组件甚至子组件中的一个模块,那么应该传入上下文。因此,这意味着如果我用匕首注入演示器,它将被绑定到ApplicationContext。这使得作为JUnit进行测试变得困难。Android代码不应该在演示器中。 所以我想问的是,最好的做法是只在活动、片段、广播接收器和服务中使用匕首吗?就mvp架构而言,这就是。另一个解决方案是设计另一个dagger组件,但不是与appco